执行从标量函数返回的查询

时间:2016-09-06 11:06:55

标签: sql sql-server tsql

我有一个返回查询的标量函数。标量函数必须返回查询本身,而不是它的'结果,因为它使用动态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>

谢谢!

2 个答案:

答案 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
相关问题