[英]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批處理中持續存在。
似乎您可以獲取列名稱,所以我假設您可以獲取列類型。 因此,您可以執行此操作(偽代碼)
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
EXEC sp_executeSQL @SQL
不是EXEC (@SQL)
,但是在這種情況下,這只是個問題 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.