我需要编写一个接受变量的存储过程(实际上,其中有几个,但会为此目的简化它),然后构建一个基于该变量进行过滤的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查询,还要检查变量是否为空值,如果用户没有传递它?
答案 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