Передайте предложение WHERE в качестве параметра в хранимую процедуру SQL Server - PullRequest
0 голосов
/ 04 декабря 2018

Я работаю над хранимой процедурой, в которой один из параметров, используемых в предложении WHERE, должен быть отправлен из кода.Для ex -

CREATE PROCEDURE sp_test
    @param1 
AS
BEGIN
    SELECT * 
    FROM Table 
    WHERE @param1
END

В вышеупомянутой хранимой процедуре значение, переданное @param1, будет примерно таким: Col1 LIKE '%abc%' AND col1 LIKE '%xyz%' Я понимаю, что это можно сделать с помощью динамического SQL, но я бы предпочел не использоватьthis.

Любая помощь будет принята.

EDIT

У меня есть столбец varchar(MAX), и я ищу поиск по этому столбцу на основезначения, введенные пользователем.Используемый оператор (И / ИЛИ) выбирается пользователем на передней панели.Это соответствует заданному вопросу здесь

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Как уже упоминалось в комментариях, обычно нет веской причины для ввода полного предложения: - Вы удаляете абстракцию уровня базы данных (если вам нужно переключить СУБД, вам нужно изменить синтаксис предложения where,при условии, что это другое).- Возможно, вы открываете себя для инъекционных атак.

Понимайте ваши требования лучше и соответствующим образом параметрируйте хранимую процедуру.Например, вам необходимо выполнить следующие запросы:

select * from TABLE where column1 like '%XX%' and column2 like '%YY%'
select * from TABLE where column1 like '%XX%' or column2 like '%YY%'`

передать 3 параметра column1Value, column2Value, clauseConnector

Затем использовать условные выражения для выполнения различных запросов:

IF @clauseConnector = 'AND'
  BEGIN
    select * from TABLE where c1 like '%' + @column1Value  + '%' AND c2 like '%' + @column2Value  + '%'
  END
ELSE
  BEGIN
    select * from TABLE where c1 like '%' + @column1Value  + '%' OR c2 like '%' + @column2Value  + '%'
  END

Вы также можете использовать динамический sql для построения запроса в одном выражении.

SET @query = 'SELECT * FROM TABLE WHERE ' + 
'Column1 like ''%' + column1Value  + '%'' '
+ @clauseConnector  + ' ' +
IIF (@column2Value IS NOT NULL,'Column2 like ''%' + column2Value  + '%'''
EXECUTE(@SQLQuery)
0 голосов
/ 04 декабря 2018

Это звучит достаточно просто, исходя из ваших правок, есть столбец varchar (MAX), который вы хотите найти.Давайте назовем это col1

CREATE PROCEDURE sp_test @ param1 КАК НАЧАТЬ ВЫБРАТЬ * ИЗ ТАБЛИЦЫ ГДЕ col1 like @ param1 END

0 голосов
/ 04 декабря 2018

Я бы создал определяемый пользователем тип таблицы с 3 столбцами:
- тип соответствия (равно, например, и т. Д.)
- искомое значение
- и / или

Я бы пропустил этов мой SP, а затем используйте динамический SQL для создания запроса.

У вас не так много других вариантов, когда пользователь может определить критерии поиска.Но я бы определенно передал условия поиска в структурированном формате, чтобы у вас был полный контроль над окончательным SQL-кодом (в отличие от приложения, запускающего предварительно сформированный SQL-запрос).

...