2010-10-06 33 views
1

解決參數我有以下查詢:如何在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' 

但它總是返回一個字符串「地址1」,而不是地址1列的值。任何人都可以幫忙

感謝

回答

2

的參數是基於數據類型立即逃跑 - 這就是爲什麼你得到的值「地址1」返回,而不是列的實際值。

提交列名不作爲參數,但作爲一個連接字符串:

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

唯一的其他替代我知道的,您需要使用決策邏輯,以重定向到列名的定義是靜態的查詢:

IF @columname = 'Address1' 
BEGIN 

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

END 
+0

的原因,我不能讓它作爲concetenate字符串是因爲由於到安全政策。這將打開SQL注入! – user384080 2010-10-06 02:34:23

+0

@ user384080:那麼你運氣不好。按照OMG的建議,你不能直接參數化列名。 – 2010-10-06 02:38:06

+0

好吧..在這樣做的時候必須有更好的方法..如果我的應用程序打開sql注入,它將不僅僅是「運氣不好」! – user384080 2010-10-06 02:42:06