簡體   English   中英

動態SQL輸出到臨時表

[英]dynamic sql output into temp table

我可以成功運行以下代碼來轉置數據集,並希望將輸出存儲在臨時表中,因此我可以在下面的腳本外部運行一些代碼,例如“ select * from #table”,然后查看結果。 任何幫助將不勝感激。

數據:

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

碼:

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)

嗯,這是一個問題,因為您事先不知道列數。
這意味着您不能使用create table定義臨時create table
我想出了一個丑陋的解決方法,也許其他人將能夠以一種更優雅的方式來做到這一點。
我的想法是使用select...into在動態sql腳本中創建全局臨時表,然后使用另一個select into從該表創建本地臨時表並刪除全局表。 (當然,如果您對全局表感到滿意,則此步驟是多余的)

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

請注意,如果您有多個用戶可能同時運行此腳本,則由於使用全局臨時表,這並不是一個好主意。

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