一尘不染

通过WHERE子句传递SQL存储过程的整体

sql

我有一个形式的SQL存储过程

SELECT [fields] FROM [table] WHERE @whereSql

我想向过程传递一个参数(@whereSql),该参数指定整个WHERE子句,但返回以下错误:

An expression of non-boolean type specified in a context where a condition is expected

能做到吗?


阅读 138

收藏
2021-05-05

共1个答案

一尘不染

简短的答案是您不能这样做-SQL Server将变量的内容视为VALUE。它不会动态构建要执行的字符串(这就是为什么这是避免SQL注入攻击的 正确
方法)的原因。

您应该尽一切努力避免动态的WHERE,主要是因为这个原因,也是为了提高效率。相反,请尝试建立WHERE子句,以使它根据情况使具有许多OR的部件短路。

如果没有办法解决,您仍然可以根据命令片段构建自己组装的字符串,然后执行。

因此,您可以这样做:

DECLARE @mywhere VARCHAR(500)
DECLARE @mystmt VARCHAR(1000)
SET @mywhere = ' WHERE MfgPartNumber LIKE ''a%'' '
SELECT @mystmt = 'SELECT TOP 100 * FROM Products.Product AS p ' + @mywhere + ';'
EXEC( @mystmt )

但我建议您执行以下操作:

SELECT TOP 100 * 
    FROM Products.Product AS p 
    WHERE 
        ( MfgPartNumber LIKE 'a%' AND ModeMfrPartNumStartsWith=1)
    OR  ( CategoryID = 123 AND ModeCategory=1 )
2021-05-05