2010-10-06 28 views
1

je la requête suivante:comment résoudre paramètre dans sp_executesql

create proc [dbo].GetCustById 
as 
DECLARE @sql nvarchar(500) 
DECLARE @Param nvarchar(200) 
SET @sql = 'select @columnName from customer where custId = @custId' 
SET @Param = N'@columnName varchar(10), @custId int' 

EXEC sp_executesql @sql, @Param , @columnName = 'Address1', @custId = '42' 

Mais il retourne toujours une chaîne « Adresse1 » au lieu de la valeur de la colonne Adresse1. Quelqu'un peut-il aider?

grâce

Répondre

2

Un paramètre est échappé immédiatement en fonction du type de données - c'est la raison pour laquelle vous obtenez la valeur « Adresse1 » est revenu plutôt que la valeur réelle de la colonne.

Soumettre le nom de colonne non comme un paramètre, mais comme une chaîne concaténée:

DECLARE @sql nvarchar(500) 
DECLARE @Param nvarchar(200) 
SET @sql = 'select '+ @columnName +' from customer where custId = @custId' 
SET @Param = N'@custId int' 

EXEC sp_executesql @sql, @Param , @custId = 42 

Read more about the behavior here.

La seule autre alternative que je suis au courant exige que vous utilisez la logique de décision de rediriger vers une requête où le nom de la colonne est définie de façon statique:

IF @columname = 'Address1' 
BEGIN 

    SET @sql = 'select Address1 from customer where custId = @custId' 

END 
+0

la raison pour laquelle je ne peux le faire en tant que chaîne concetenate est parce qu'en raison à la politique de sécurité. cela va ouvrir à l'injection sql! – user384080

+0

@ user384080: alors vous n'avez pas de chance. Vous ne pouvez pas directement paramétrer un nom de colonne sans faire comme le suggère OMG. –

+0

bien .. il doit y avoir une meilleure façon de le faire là-bas .. ce sera plus que "pas de chance" si mon application est ouverte à l'injection sql! – user384080