Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何求解sp_executesql中的参数_Sql_Sql Server_Tsql_Sql Server 2008_Dynamic Sql - Fatal编程技术网

如何求解sp_executesql中的参数

如何求解sp_executesql中的参数,sql,sql-server,tsql,sql-server-2008,dynamic-sql,Sql,Sql Server,Tsql,Sql Server 2008,Dynamic Sql,我有以下疑问: 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, @Par

我有以下疑问:

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'
但它总是返回字符串“Address1”,而不是Address1列的值。有人能帮忙吗


谢谢,参数会根据数据类型立即转义——这就是为什么返回值“Address1”,而不是列的实际值

提交列名时不要将其作为参数,而应将其作为串联字符串:

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

我知道的另一种选择要求您使用决策逻辑重定向到静态定义列名的查询:

IF @columname = 'Address1' 
BEGIN

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

END

我无法将其设置为concetenate字符串的原因是由于安全策略。这将对sql注入开放@用户384080:那么你就不走运了。如果不按照OMG的建议做,就不能直接参数化列名。。必须有更好的方法来做这件事。。如果我的应用程序对sql注入开放,那将不仅仅是“运气不好”!错误的sql注入语法。。试试这个:“Top1*from customer;drop table customer--”@user384080:更好的例子:“a”;drop table customer--”,因为人们不太可能知道实际的表。