简体   繁体   English

动态SQL输出到临时表

[英]dynamic sql output into temp table

I can successfully run the following code to transpose a data set, and would like to store the output in a temporary table so I can run some code like 'select * from #table' outside the script below and see the results. 我可以成功运行以下代码来转置数据集,并希望将输出存储在临时表中,因此我可以在下面的脚本外部运行一些代码,例如“ select * from #table”,然后查看结果。 Any help will be appreciated. 任何帮助将不胜感激。

Data: 数据:

TimeSeconds TagID Value
1378700244  A1    3.75
1378700245  A1    30
1378700304  A1    1.2
1378700305  A2    56
1378700344  A2    11
1378700345  A3    0.53
1378700364  A1    4
1378700365  A1    14.5
1378700384  A1    144
1378700384  A4    10

Code: 码:

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX)

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(TagID)
            FROM Table1
            ORDER BY 1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @sql = 'SELECT TimeSeconds, ' + @cols + '
              FROM
            (
              SELECT TimeSeconds, TagID, Value
                FROM table1
            ) s
            PIVOT
            (
              MAX(Value) FOR TagID IN (' + @cols + ')
            ) p'

EXECUTE(@sql)

Well, it is a problem since you don't know in advance the number of columns. 嗯,这是一个问题,因为您事先不知道列数。
This means you can't define the temporary table with a create table . 这意味着您不能使用create table定义临时create table
I came up with quite an ugly workaround, perhaps somebody else will be able to do it in a more elegant way. 我想出了一个丑陋的解决方法,也许其他人将能够以一种更优雅的方式来做到这一点。
My idea is to create a global temporary table in the dynamic sql script using select...into , and then using another select into to create a local temporary table from that table and drop the global table. 我的想法是使用select...into在动态sql脚本中创建全局临时表,然后使用另一个select into从该表创建本地临时表并删除全局表。 (Of course, if you are happy with a global table this step is redundant) (当然,如果您对全局表感到满意,则此步骤是多余的)

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX)

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(TagID)
            FROM Table1
            ORDER BY 1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'')

-- Note I'va added ' INTO ##TEMP'
SET @sql = 'SELECT TimeSeconds, ' + @cols + ' INTO ##TEMP 
              FROM
            (
              SELECT TimeSeconds, TagID, Value
                FROM table1
            ) s
            PIVOT
            (
              MAX(Value) FOR TagID IN (' + @cols + ')
            ) p'

EXECUTE(@sql)


-- Create the local temporary table from the data in the global one
SELECT * INTO #Temp 
FROM ##TEMP
-- Drop the global temporary table
DROP TABLE ##TEMP

Note that if you multiple users might run this script at the same time it's not really a good idea, because of the use of a global temporary table. 请注意,如果您有多个用户可能同时运行此脚本,则由于使用全局临时表,这并不是一个好主意。

IF OBJECT_ID('Tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp

;With cte(TimeSeconds, TagID, Value)
AS
(
SELECT 1378700244,'A1',3.75 Union all
SELECT 1378700245,'A1',30   Union all
SELECT 1378700304,'A1',1.2  Union all
SELECT 1378700305,'A2',56   Union all
SELECT 1378700344,'A2',11   Union all
SELECT 1378700345,'A3',0.53 Union all
SELECT 1378700364,'A1',4    Union all
SELECT 1378700365,'A1',14.5 Union all
SELECT 1378700384,'A1',144  Union all
SELECT 1378700384,'A4',10   
)
SELECT * INTO #temp From cte

DECLARE @cols Nvarchar(max),
        @sql Nvarchar(max),
        @sql2 Nvarchar(max),
        @cols2 Nvarchar(max)


SET @cols = STUFF((SELECT DISTINCT ',' + 'ISNULL('+ TagID +',''0'' )'+' AS '+ QUOTENAME(TagID) FROM #temp
            ORDER BY 1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'')


SET @cols2 = STUFF((SELECT DISTINCT ',' +  QUOTENAME(TagID) FROM #temp
            ORDER BY 1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'')


SET @sql = 'SELECT TimeSeconds, ' + @cols + ' INTO #Temp1
              FROM
            (
              SELECT TimeSeconds, TagID, Value
                FROM #Temp
            ) s
            PIVOT
            (
              MAX(Value) FOR TagID IN (' + @cols2 + ')
            ) p'

PRINT @sql

SET @sql2='SELECT TimeSeconds,'+ @cols + ' FROM  #temp1'

PRINT @sql2

EXECUTE(@sql)

EXECUTE(@sql2)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM