我无法获得动态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执行的查询?
答案 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;
这意味着可以在没有间接+
和变量的情况下构建语句。这意味着输入和输出参数正常使用。