2016-09-06 2 views
3

У меня есть скалярная функция, которая возвращает запрос. Скалярная функция должна возвращать сам запрос, а не его «результаты», поскольку использует динамический SQL, а переменные используются как имена столбцов и имена таблиц.Выполнение запроса, возвращаемого из скалярной функции

Итак, у меня есть что-то вроде этого:

SELECT t.id, 
     dbo.queryToExecute(t.id, t.ColumnToFetch, t.TableToFetchFrom) QueryToExecute 
FROM Table t 

который возвращает

| ID | QueryToExecute 
| 1 | SELECT ColumnName1 FROM Table1 WHERE id = 1 
| 2 | SELECT ColumnName2 FROM Table2 WHERE id = 2 

В то время как "QueryToExecute" возвращает единственное значение. Я хочу сделать что-то вроде:

SELECT t.id, 
     EXEC(dbo.queryToExecute(t.id, t.ColumnToFetch, t.TableToFetchFrom)) ExecutedQuery 
FROM Table t 

Так что набор результатов будет:

| ID | ExecutedQuery 
| 1 | Jacob 
| 2 | Sarah 

Как я могу это сделать?

У меня уже есть хранимая процедура, которая выполняет задание, когда мне нужно запускать индивидуально, но я хотел иметь то же самое на скалярной функции, чтобы иметь возможность встраивать подвыборы в более сложные запросы.

Спасибо!

ответ

2

Вам необходимо использовать динамический SQL:

DECALRE @sql nvarchar(max) 

SELECT @sql = COALESCE(@sql,'') + 
      REPLACE(
       dbo.queryToExecute(t.id, t.ColumnToFetch, t.TableToFetchFrom), 
       'SELECT ', 
       'SELECT '+ CAST(t.ID as nvarchar(max) +' as ID, ' 
       ) +' UNION ALL ' 
FROM Table t 

SELECT @sql = LEFT(@sql,LEN(@sql)-LEN('UNION ALL ')) 

EXEC sp_executesql @sql 

Это позволит получить весь запрос в одной этой партии и выполнить его

+0

У меня есть 2 проблемы с этим: 1. Я хочу получить выполненный запрос вместе с id (другой столбец). 2. Теперь я получаю набор результатов для каждой строки в таблице. Я хочу получить единый результирующий набор со всеми идентификаторами и их выполненными запросами. – noamyg

+0

Показать результаты, которые вам нужны – gofr1

+0

Я отредактировал вопрос с нужной выводом, спасибо – noamyg

0

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

Этот скрипт будет генерировать оператор выбора для каждой строки и объединить их все вместе. Затем вы запускаете весь этот выбор, чтобы получить результат.

--set up a string variable to store your query 
declare @tsql nvarchar(max); 
set @tsql = ''; 

-- populate it with the string statements 
select @tsql = @tsql + 'select ' + cast(t.id as nvarchar(10)) + ' as id , (' + dbo.queryToExecute(t.id, t.ColumnToFetch, t.TableToFetchFrom) + ') QueryToExecute union ' from Table t 

--chop off the final "union" 
select @tsql = left (@tsql,len(@tsql)-7); 

--and run 
EXEC sp_executesql @tsql 
Смежные вопросы