У меня есть хранимая процедура SQL формы
SELECT [fields] FROM [table] WHERE @whereSql
Я хочу передать процедуру аргумент (@whereSql), который указывает весь оператор Where, но следующая ошибка возвращается:
An expression of non-boolean type specified in a context where a condition is expected
Это может быть сделано?
Короткий ответ заключается в том, что вы не можете сделать это таким образом - 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 )
Я считаю, что это можно сделать с помощью динамического SQL. См. Ниже:
CREATE PROCEDURE [dbo].[myProc]
@whereSql nvarchar(256)
AS
EXEC('SELECT [fields] FROM [table] WHERE ' + @whereSql)
GO
Тем не менее, вам следует провести серьезное исследование динамического SQL, прежде чем использовать его. Вот несколько ссылок, которые я обнаружил после быстрого поиска: