2010-06-23 120 views
1

如何传递并使用列名在实际列中检索bigint变量?如何在存储过程中将列作为参数传递?

DECLARE @personID BIGINT, 
DECLARE @queryString varchar(500) 

Set @queryString = 'Select @personID = ' + @PersonColumnID + ' from dbo.Loss_Witness where WitnessID = @witnessID' 
exec(@queryString) 

错误消息状态“必须声明变量'@personID'”。我也试过

Set @queryString = 'Select ' + @personID + ' = ' + @witnessPersonID + ' from dbo.Loss_Witness where WitnessID = @witnessID' 

并得到了错误信息“Error conversion data type varchar to bigint。”

有什么想法?

回答

6

你需要指定@personID与OUTPUT关键字的输出参数:

DECLARE @SQL NVARCHAR(max) 
    SET @SQL = 'SELECT @personID = w.' + @PersonColumnID + ' 
        FROM dbo.Loss_Witness w 
       WHERE w.witnessID = @witnessID ' 

BEGIN 

    EXEC sp_executesql @SQL, @personID = @personID OUTPUT, @witnessID 

END 

another example here

1

另请注意,代码中可能存在SQL注入安全漏洞。如果你没有清理@PersonColumnID,那么你可能会遇到很大的麻烦。

+0

@OMG Ponies这里仍然存在风险,即使轻微:列名不能作为参数传递给sp_executesql,因此也不能将输入中的串联原因(但请注意值已参数化)。 – 2010-06-23 20:45:13

+0

我很努力去理解这个评论。您引用的论文非常好,并且在动态SQL上进行了标准读取。但是不管如何,除非@PersonColumnID被清理,否则在给定的代码和重写中有一个巨大的SQL注入点。提问者可能没有意识到这一点。 – Yellowfog 2010-06-23 20:52:13

+0

SELECT @PersonColumnID ='1; drop database blah - '; – Yellowfog 2010-06-23 20:54:04

相关问题