变量超出Dynamic SQL的范围

时间:2012-12-20 15:49:09

标签: sql-server-2008 dynamic-sql

我需要编写一个接受变量的存储过程(实际上,其中有几个,但会为此目的简化它),然后构建一个基于该变量进行过滤的SQL语句。但是,用户可以选择是否传递该变量。如果用户不传递变量,则过滤器必须忽略该片段,而不是返回Null值。

基本上,我得到的是:

@VariableA varchar(50)
@SQL nvarchar(max)

Select @SQL = 'Select ColumnX from TableY where (('+@VariableA+ ' = somevalue) or (@VariableA is null))'

exec sp_executesql @SQL

所以,我的问题是,当@SQL字符串作为查询执行时,@ VariableA变量超出范围。如何编写要运行的动态SQL查询,还要检查变量是否为空值,如果用户没有传递它?

1 个答案:

答案 0 :(得分:0)

你需要在这里添加更多参数,并且你不需要在@SQL字符串中连接变量,额外的变量告诉动态SQL应该引用什么:

declare @VariableA varchar(50)
  , @SQL nvarchar(max)

Select @SQL = N'Select ColumnX from TableY where (@VariableA = somevalue) or (@VariableA is null)'

exec sp_executesql @SQL, N'@VariableA varchar(50)', N'@VariableA = @VariableA'

您需要在动态SQL之前批准设置@VariableA。

更多信息:http://msdn.microsoft.com/en-us/library/ms188001(v=sql.100).aspx