Передавать столбцы как переменные в хранимую процедуру в T-SQL - PullRequest
2 голосов
/ 06 декабря 2010

Я немного озадачен лучшим способом построения хранимой процедуры, которая возвращает инструкцию SELECT на основе значений строки таблицы в другой таблице.

Проблема может быть лучше всего описана следующим образом:

Table Name: reportValues
--------------------------------------------
ID       name       date        region
--------------------------------------------
1        Stefan     2010-01-01  UK
2        David      2010-01-05  SE
3        Anna       2010-01-12  NO
4        Marie      2010-01-15  NO


Table Name: reportParameters
-------------------------------
ID       column     queryValue 
-------------------------------
1        ID       
2        name     
3        date       
4        region     

Основываясь на том, что пользователь вводит в столбец queryValue в таблице reportParameters, я хочу создать хранимую процедуру, которая выполняет инструкцию SELECT, например:

SELECT * FROM reportValues WHERE region = 'NO' 

Если пользователь ввел следующие значения:

Table Name: reportParameters
-------------------------------
ID       column     queryValue 
-------------------------------
1        ID       
2        name       
3        date       
4        region     NO

Но это может быть и так:

SELECT * FROM reportValues WHERE region = 'NO' AND name = 'Anna'

Если пользователь ввел:

Table Name: reportParameters
-------------------------------
ID       column     queryValue 
-------------------------------
1        ID       
2        name       Anna
3        date       
4        region     NO

Моя первоначальная мысль сделать это состояла в том, чтобы создать цикл, который конструирует инструкцию SELECT в строковую переменную и выполняет ее. Но это должно быть более элегантное решение?

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Я не уверен, что если запросы имеют небольшой, известный набор полей, вы можете перечислить их все в том месте, где сопровождается селектор:

(IF NOT NULL reportParameters.field AND reportParameters.field = reportValues.field)

Оценка короткого замыкания отсутствует, но она все равно может дать желаемый эффект. Иначе это до динамического SQL и EXEC().

0 голосов
/ 06 декабря 2010

Вы можете создавать условные предложения WHERE, используя CASE.См. это близко к нижней части статьи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...