将exec sp_executesql结果加载到表中

时间:2014-12-11 16:50:00

标签: sql-server tsql stored-procedures

我从previous question获得了以下查询,这在SQL中的动态表中执行。我怎么能把它传递到一张桌子里?我的意思是像sp_executesql @query中的select *。

我试过openrowset,但我的安全特权不允许。还有其他任何帮助吗?

谢谢,

Declare @cols as NVARCHAR(MAX), @query as NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(FIELD_NAME) 
                from bear_crossjoin
                group by Field_Name, FIELDNUMBER
                order by FIELDNUMBER
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = N'SELECT ' + @cols + N' 
            from 
            (
                select substring, Field_Name,
                  rn = row_number() over(partition by field_name order by fieldnumber)
                from bear_crossjoin
            ) x
            pivot 
            (
                max(substring)
                for Field_Name in (' + @cols + N')
            ) p ' 
exec sp_executesql @query

Print(@query)将显示列名

SELECT [GRADE-BASIS-INDICATOR],[MOST-CURRENT-CODE],[PAY-PERIOD-NUMBER],[DATE-PROC-PP-BEGINS-CN],[DATE-PROC-PP-BEGINS-YR ],[行动代码],[NO-PERSONS-CASH-AWARD] ......其中有1085个

1 个答案:

答案 0 :(得分:1)

由于提取动​​态字段列表,这种情况需要以SELECT {fields} INTO ##tmp FROM...完成,因为没有简单的方法来获取CREATE TABLE语句,特别是如果bear_crossjoin表一样没有列出的数据类型。因此,请将Dynamic SQL更新为一行,如下所示:

set @query = N'SELECT ' + @cols + N' 
               INTO ##TempResults  -- add this one line!!
            from 
            (
...
exec sp_executesql @query

SELECT * FROM ##TempResults;

全局临时表(即##name而不是#name)将在子流程中生成。一张真正的桌子也能存活下来。但是,一旦子进程(即动态SQL)结束,本地临时表(即#name而不是##name)将消失。