如何将动态数据透视变量输出保存为SQL Server表

时间:2012-11-16 15:57:24

标签: tsql sql-server-2005 variables pivot

我已经成功构建了我一直在寻找的输出,使用动态SQL创建一个包含动态创建的列名的数据透视表。

我的代码是:

IF OBJECT_ID('tempdb..#TempDB') IS NOT NULL
DROP TABLE #TempDB
SELECT CASEID, FORMNAME, NAME, VALUE INTO #TempDB FROM dbo.EFORM WHERE FORMNAME='IncidentReporting'

 IF OBJECT_ID('tempdb..#TempDB1') IS NOT NULL
DROP TABLE #TempDB1
SELECT DISTINCT Name INTO #TempDB1 FROM #TempDB

DECLARE @columns varchar(max)
DECLARE @query varchar(max)

SELECT @columns = COALESCE(@columns + ',[' + cast([Name] as varchar(100)) + ']', 
             '[' + cast([Name] as varchar(100))+ ']') 
             FROM #TempDB1

SET @query = 'SELECT * FROM #TempDB AS PivotData '
SET @query = @query  + 
'PIVOT (MAX(VALUE) FOR [NAME] IN (' + @columns + ')) AS p'

EXEC (@query)

这成功地给了我以下结果:

CASEID  FORMNAME             Column1    Column2 Column3
501000000621    IncidentReporting   Value1  Valuea  Valuev
501000000622    IncidentReporting   Value2  Valueb  Valuew
601000000126    IncidentReporting   Value3  Valuec  Valuex
601000000127    IncidentReporting   Value4  Valued  Valuey
601000000128    IncidentReporting   Value5  Valuee  Valuez

这些结果从@query变量中输出,完全符合我想要这些结果表的格式。

有人能告诉我如何将@query变量中的结果导入标准SQL表吗?

我尝试过这样的声明,但是我收到消息“'+ @columns +'附近的语法不正确”:

SELECT *
INTO #TempDB4
FROM (SELECT * FROM #TempDB AS PivotData 
PIVOT (MAX(VALUE) FOR [NAME] IN (' + @columns + ')) AS p)

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

在现有代码中,将into添加到此行:

SET @query = 'SELECT * FROM #TempDB AS PivotData '

这样你就得到了:

SET @query = 'SELECT * INTO #TempDB4 FROM #TempDB AS PivotData '

或以相同的方式添加insert

要让不成功的查询按预期工作,您必须将其转换为动态SQL,就像成功查询一样,并使用execsp_executesql

进行调用