簡體   English   中英

使用動態SQL創建表

[英]Using dynamic SQL to create a table

以下作品:

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX);

SET @cols = 
STUFF
    (
        (
        SELECT   ',' + QUOTENAME(b."NewName")
        FROM    (
                    SELECT  myKey, 
                        win = SUM(win)
                    FROM    xxx.dbo.yyy
                    GROUP BY myKey
                    ) x
                    INNER JOIN #NameSwitch b ON
                        x.myKey = b.myKey
        ORDER BY x.win DESC
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'');


SET @query =    
    'SELECT [Measure],' + @cols + ' 
    FROM  
        (
            SELECT  [NewName], [Measure], [Amount]
            FROM    #UnpivottedData x
        ) x
        PIVOT 
        (
            SUM(Amount)
            FOR [NewName] in (' + @cols + ')
        ) p ';

EXECUTE(@query);

但是問題是我想將結果輸入到臨時表#xxx ,然后可以通過SELECT * FROM #xxx使用此數據。

運行上述代碼之前,我需要使用dynamic sql CREATE #xxx嗎? 如果是這樣,那么任何人都可以指出我完成該示例的方向。

嘗試更改包括條款

SET @query =    
'SELECT [Measure],' + @cols + ' 
 into ##xxx
FROM  
    (
        SELECT  [NewName], [Measure], [Amount]
        FROM    #UnpivottedData x
    ) x
    PIVOT 
    (
        SUM(Amount)
        FOR [NewName] in (' + @cols + ')
    ) p ';

這將為結果創建臨時表...

如果您確實要在選擇之前創建。

您將需要收集列的類型以構建創建表語句。

弗雷德里克(Frederic) 幾乎是正確的-

動態SQL在與調用批處理不同的范圍內執行。 動態SQL批處理中聲明的任何臨時對象(表,變量)僅在動態SQL批處理中可用。 您將能夠SELECT INTO一個全局臨時表-因為這些臨時表是特定於連接的,並且將在動態SQL批處理中持續存在。

sp_executesql

似乎您可以獲取列名稱,所以我假設您可以獲取列類型。 因此,您可以執行此操作(偽代碼)

CREATE TABLE #XXX (Measure <type>)
//
   generate scripts like 
SET @SQL = N'ALTER TABLE #XXX ADD '+ ColumnName+' '+ColumnTypeInfo
EXEC SP_ExecuteSQL @SQL
//

SET @query =    
    'INSERT INTO #XXX ([MEASURE], '+@cols+')
     SELECT [Measure],' + @cols + ' 
    FROM  
        (
            SELECT  [NewName], [Measure], [Amount]
            FROM    #UnpivottedData x
        ) x
        PIVOT 
        (
            SUM(Amount)
            FOR [NewName] in (' + @cols + ')
        ) p ';

EXECUTE(@query);

PS

  1. 我本人會選擇EXEC sp_executeSQL @SQL不是EXEC (@SQL) ,但是在這種情況下,這只是個問題
  2. 我將簡化代碼-您實際上不需要STUFF部分,因為您需要在連接中使用第一個逗號,因此無需刪除它。 另外,您僅強制XML列(帶有TYPE子句)將其轉換為NVARCHAR

以后編輯

免責聲明:未經測試,因為我沒有您的表結構和數據

DECLARE @cols NVARCHAR(MAX),
        @query NVARCHAR(MAX), 
        @alter_query NVARCHAR(max);

SET @cols = 
        (
        SELECT   ',' + QUOTENAME(b."NewName")
        FROM    (
                    SELECT  myKey, 
                        win = SUM(win)
                    FROM    xxx.dbo.yyy
                    GROUP BY myKey
                    ) x
                    INNER JOIN #NameSwitch b ON
                        x.myKey = b.myKey
        ORDER BY x.win DESC
        FOR XML PATH('')
        ) -- this will render smth like ",col1,col2" 
SET @alter_query = 
        (
        SELECT   ';ALTER TABLE #XXX ADD ' + QUOTENAME(b."NewName") +' '+ QUOTENAME(b."ColType") +' NULL'
        FROM    (
                    SELECT  myKey, 
                        win = SUM(win)
                    FROM    xxx.dbo.yyy
                    GROUP BY myKey
                    ) x
                    INNER JOIN #NameSwitch b ON
                        x.myKey = b.myKey
        ORDER BY x.win DESC
        FOR XML PATH('')
        ) -- this will render smth like ";ALTER TABLE #XXX ADD col1 VARCHAR(MAX);ALTER ..." 

CREATE TABLE #XXX (Measure INT NULL)

EXEC sp_ExecuteSQL @alter_query

SET @query =    
    'INSERT INTO #XXX (Measure+'@Cols+') SELECT [Measure]' + @cols + ' 
    FROM  
        (
            SELECT  [NewName], [Measure], [Amount]
            FROM    #UnpivottedData x
        ) x
        PIVOT 
        (
            SUM(Amount)
            FOR [NewName] in (' + STUFF(@cols, 1, 1, '') + ') -- here you need the STUFF to remove the first comma
        ) p ';


EXEC sp_ExecuteSQL @Query

SELECT * from #XXX 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM