gpt4 book ai didi

sql - 传递整个 WHERE 子句的 SQL 存储过程

转载 作者:行者123 更新时间:2023-12-02 21:29:54 25 4
gpt4 key购买 nike

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

SELECT [fields] FROM [table] WHERE @whereSql

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

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

这可以做到吗?

最佳答案

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

您应该尽一切努力避免您尝试执行的动态 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 )

关于sql - 传递整个 WHERE 子句的 SQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3085756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com