带有存储过程的动态SQl

时间:2011-01-04 05:31:29

标签: c# sql-server-2008

如何将sp_executesql与动态值参数一起使用

我想通过逗号分隔字符串或类似

之类的循环生成参数值
declare @sql nvarchar(1000),  @answer nvarchar(1000)
set @sql='SELECT TOP 1000 [UserID]
      ,[DateOfBirth]
      ,[UserActivityType]
      ,[FirstName]
      ,[LastName]
      ,[Gender]
  FROM [LogX].[dbo].[UserDetails] where firstname=@name and gender =@gender '
  set @values =  '"jack","1"' 
  EXEC  sp_executesql   @sql  , N'@name nvarchar(100),@gender tinyint',@values 

请注意,可以有超过2个参数 任何的想法? 感谢。

3 个答案:

答案 0 :(得分:0)

试试这个

declare @sql nvarchar(1000),  @answer nvarchar(1000)
set @sql='SELECT TOP 1000 [UserID]
      ,[DateOfBirth]
      ,[UserActivityType]
      ,[FirstName]
      ,[LastName]
      ,[Gender]
  FROM [LogX].[dbo].[UserDetails] where firstname='+@name+' and gender ='+@gender
  set @values =  '"jack","1"' 
  EXEC  sp_executesql   @sql  , N'@name nvarchar(100),@gender tinyint',@values

使用字符串连接传递参数

答案 1 :(得分:0)

您知道sp_executesql的整个点是为了防止您进行字符串连接。您可以使用linq之类的库为您动态生成查询,然后使用sp_Executesql。

SQL查询中的字符串连接是针对称为SQL注入的网站和应用程序的关键攻击媒介。 SQL Injection at wikipedia

答案 2 :(得分:0)

您需要将CSV值的字符串解析为不同的变量,然后传递给sp_executesql - 在进行参数化SQL时,没有办法解决这个问题(这正是您应该做的)。

否则,你会考虑为动态SQL做(可怕的)字符串连接,而不是参数化,这会很糟糕。