EXEC-запрос хранится в столбце - PullRequest
1 голос
/ 06 июня 2019

Я хочу иметь возможность получить результат запроса, сохраненный в столбце, параметризованный значением в другом. Модель более реляционная (запросы находятся в 1 - n связанной таблице), но для простоты:

value | query
------------- 
25    | SELECT id, name FROM courses
12    | SELECT id, name FROM countries

Я хочу иметь возможность получать результаты запросов, поэтому что-то вроде

SELECT EXEC(query + ' WHERE id = ' + value) FROM table

Я бы хотел обойтись без стороны приложения.

Возможно ли это?

PS: риск SQL-инъекций не вступает в игру, он уже преодолен.

1 Ответ

2 голосов
/ 06 июня 2019

Один из возможных подходов - генерировать и выполнять динамический оператор для всех возможных SELECT операторов.

Таблица:

CREATE TABLE #Statements (
    [value] int,
    [query] nvarchar(max)
)
INSERT INTO #Statements 
   ([value], [query])
VALUES
    (25, N'SELECT id, name FROM courses'),
    (12, N'SELECT id, name FROM countries')

T-SQL:

DECLARE @stm nvarchar(max) = N''
SELECT @stm = (
   SELECT 
      CONCAT(
         [query],
         N' WHERE id = ',
         [value],
         N'; '
      )
   FROM #Statements
   FOR XML PATH('')
   )
PRINT @stm
EXEC sp_executesql @stm

Сгенерированные операторы:

SELECT id, name FROM courses WHERE id = 25; 
SELECT id, name FROM countries WHERE id = 12; 

Если вы хотите извлечь результаты всех ваших операторов в единый набор результатов и если столбцы id и name имеют совместимые типы данных, вы можете выполнить следующееоператор (с возможными CONVERT звонками):

DECLARE @stm nvarchar(max) = N''
SELECT @stm = STUFF(
   (    
   SELECT 
      CONCAT(
         N'UNION ALL ',
         [query],
         N' WHERE id = ',
         [value],
         N' '
      )
   FROM #Statements
   FOR XML PATH('')
   ),
   1, 10, N'')
PRINT @stm
EXEC sp_executesql @stm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...