【问题标题】:Execute a query returned from a scalar function执行从标量函数返回的查询
【发布时间】:2017-01-13 19:48:07
【问题描述】:

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

我该怎么做?

我已经有一个存储过程,可以在我需要单独运行时完成工作,但我想在标量函数上使用相同的东西,以便能够将子结果嵌入到更复杂的查询中。

谢谢!

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    你需要使用动态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
    

    这将在一批中获取所有查询并执行它

    【讨论】:

    • 我有 2 个问题: 1. 我想获取执行的查询以及 id(另一列)。 2. 现在我得到了表中每一行的结果集。我想获得一个包含所有 id 及其执行查询的结果集。
    • 请显示您需要的结果集
    • 我用所需的输出编辑了问题,谢谢
    • 好的,很酷。我不得不做一些小的改变,但它的工作原理!另外,我的查询包含一个子选择,所以我不得不用 STUFF 替换“REPLACE”:social.msdn.microsoft.com/Forums/sqlserver/en-US/….
    【解决方案2】:

    你需要让你的动态 sql 更深入,并包含 id 号。

    此脚本将为每一行生成一个选择语句,并将它们合并在一起。然后,您可以一次运行整个选择以获取输出。

    --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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2012-07-05
      • 1970-01-01
      相关资源
      最近更新 更多