sp_executesql始终为true条件

时间:2017-04-03 10:22:15

标签: sql-server dynamic-sql

我一直在sql-server中使用动态查询,如:

declare @sql nvarchar (1000),@condition nvarchar(100)='';
set @sql=N'select * from tablename where (0=0)'+@condition+'';
exec(@sql)

通过这个我能够得到我的结果@condition是否有任何价值。 但我知道sp_executesqlexec更好,因为它促进了查询计划的重用。

所以,我用`sp_executesql,

尝试了我的查询
set @sql =N'select * from dbo.testclient where (0=0) @condition'
exec sp_executesql @sql,N'@condition nvarchar(100)',@condition

但是因为

错误而失败了
Incorrect syntax near '@condition'.

我的问题是如何让上述查询与sp_executesql一起使用,其中参数@condition可以是条件或空白(&#39;&#39;)以及我做错了什么。< / p>

2 个答案:

答案 0 :(得分:0)

在sp_executesql中使用@condition等变量时,它不会简单地用sql字符串中的变量替换变量的内容。

变量是绑定到提供的值,而sql语句是不受影响的。

这意味着如果要利用查询计划重用,则需要创建一个使用变量的完整sql语句。

例如:

SET @byIDsql = 'select * from tableName where (0=0) and Id = @Id'
SET @byNameSQL = 'select * from tableName where (0=0) and FirstName = @FirstName'

然后,您可以使用sp_executesql提供@id和@firstName的值,并重新获得查询计划。

exec sp_executesql @byIDsql, N'@ID INT', 15

答案 1 :(得分:0)

经过测试的代码,

     DECLARE @Sql   nvarchar(MAX)='',                                
        @paramlist  nvarchar(4000),          
 @id int=3
 set @paramlist = N' @id1 int'
set @Sql='select * from test where id=@id1'

exec sp_executesql @Sql,@paramlist,@id 
select @Sql