Sql динамически параметризован, где поле и значение

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

SELECT * FROM OrderBatch WHERE <field> LIKE '%pattern%';

Однако я хочу, чтобы предложение where было динамическим. В идеале это выглядело бы так:

CREATE PROCEDURE [dbo].[spGetOrderBatchesFiltered]
    @filterField VARCHAR(50) = 'Delivery Address',
    @filterValue VARCHAR(300)  = '%%'
AS
    SELECT * FROM OrderBatch WHERE @filterField LIKE @filterValue;
GO

С этим две проблемы:

  1. @filterField - это не точное имя столбца, поскольку оно передается из уровня представления, поэтому мне нужно сопоставить его значение с правым столбцом (иногда даже с расчетным значением). Даже если бы это было точное имя столбца, я не думаю, что это работает синтаксически.

  2. @filterValue может быть в разных форматах в зависимости от @filterField. Поэтому иногда мне нужно преобразовать его в DATETIME или что-то в этом роде. Это также означает, что для некоторых столбцов я не могу использовать ключевое слово LIKE, я должен использовать = (т.е. если это DATETIME).

Я просмотрел все в Интернете и нашел множество сценариев использования операторов case, но так и не смог заставить их работать с моим сценарием. Все они применимы только к стоимости. Поэтому я попытался применить его и к себе с помощью столбца:

CASE WHEN @filterField='Full Address' THEN [OrderItem].[ADDRESS] END LIKE @filterValue,
CASE WHEN @filterField='Delivery Contact Phone' THEN [Customer].[Delivery_Contact_Phone] END LIKE @filterValue

Но вроде ничего не работает. Все, что я пробую, не удается скомпилировать при первом же операторе case.

Так:

Как разрешить @filterField указать используемый столбец и преобразование @filterValue?

Данное требование может быть выполнено с помощью динамического sql, поскольку вы пытаетесь динамически предоставлять имя столбца. Какую версию dbms вы используете.

Ramji 10.08.2018 14:58

Я использую MSSQL.

Ian Kirkpatrick 10.08.2018 15:01
Этот - важное чтение, но оно того стоит.
Jeroen Mostert 10.08.2018 15:12

Спасибо. я взгляну

Ian Kirkpatrick 10.08.2018 15:29
0
4
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Команды динамического SQL с использованием EXEC

CREATE PROCEDURE [dbo].[spGetOrderBatchesFiltered]
    @filterField VARCHAR(50) = 'Delivery Address',
    @filterValue VARCHAR(300)  = '%%'
AS
    DECLARE @sqlCommand varchar(1000)
    SET @sqlCommand = 'SELECT * FROM OrderBatch WHERE ' + @filterField  + ' like ' + @filterValue
    EXEC (@sqlCommand)
GO

Другие вопросы по теме