我有一个以下形式的 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 将变量的内容视为 VALUE。它不会动态构建要执行的字符串(这就是为什么这是correct避免 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 )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)