Передающая полнота хранимой процедуры SQL оператора Where

У меня есть хранимая процедура SQL формы

SELECT [fields] FROM [table] WHERE @whereSql

Я хочу передать процедуру аргумент (@whereSql), который указывает весь оператор Where, но следующая ошибка возвращается:

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

Это может быть сделано?

5
задан alpheus 21 June 2010 в 14:56
поделиться

3 ответа

Короткий ответ заключается в том, что вы не можете сделать это таким образом - 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 )
9
ответ дан 18 December 2019 в 07:28
поделиться

Я считаю, что это можно сделать с помощью динамического SQL. См. Ниже:

CREATE PROCEDURE [dbo].[myProc]
@whereSql nvarchar(256)

AS
    EXEC('SELECT [fields] FROM [table] WHERE ' + @whereSql)
GO

Тем не менее, вам следует провести серьезное исследование динамического SQL, прежде чем использовать его. Вот несколько ссылок, которые я обнаружил после быстрого поиска:

8
ответ дан 18 December 2019 в 07:28
поделиться

Обязательно прочтите это полностью

www.sommarskog.se/dynamic_sql.html

3
ответ дан 18 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: