[英]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.