将动态WHERE子句与sp_executesql一起使用

时间:2016-04-28 13:45:56

标签: sql-server sql-server-2008 sql-server-2012 dynamic-sql

我无法获得动态where子句的工作原理。我使用的查询:

IF NOT EXISTS ( SELECT  *
                FROM    sys.tables
                WHERE   name = 'a' )
    BEGIN
        CREATE TABLE a ( a INT );

    END;
DECLARE @whereClause NVARCHAR(MAX) = ' 1=1 ';

DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM a WHERE @whereClause';

EXEC sp_executesql @sql, N'@whereClause NVARCHAR(MAX)', @whereClause;

DROP TABLE a;

那么另外一个问题是:有没有可能调试用sl_executesql执行的查询?

1 个答案:

答案 0 :(得分:1)

如前所述,您不能使用sp_executesql上的参数来替换语句对象,只能替换参数变量。

如果需要动态构建WHERE子句,我发现将REPLACE用于语句的Object组件会更容易。

DECLARE @whereClause NVARCHAR(MAX) = ' 1=@whereVariable ';
DECLARE @whereVariable INT = 1;
DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM a WHERE @whereClause';

SELECT @sql = REPLACE(@sql, '@whereClause', @whereClause)

EXEC sp_executesql @sql
    ,'@whereVariable INT'
    ,@whereVariable = @whereVariable;

这意味着可以在没有间接+和变量的情况下构建语句。这意味着输入和输出参数正常使用。