我有一个返回查询的标量函数。标量函数必须返回查询本身,而不是它的'结果,因为它使用动态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
我该怎么做?
我已经有了一个存储过程,可以在需要单独运行时完成工作,但我想在标量函数上使用相同的东西,以便能够将子结果嵌入到更复杂的查询中。 / p>
谢谢!
答案 0 :(得分: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
这将在一个批次中获取所有查询并执行它
答案 1 :(得分:0)
您需要将动态sql更深入一步,并包含ID号。
此脚本将为每一行生成一个select语句,并将它们组合在一起。然后,您可以一次性运行整个选择以获得输出。
--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