我已经成功构建了我一直在寻找的输出,使用动态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)
非常感谢提前。
答案 0 :(得分:2)
在现有代码中,将into
添加到此行:
SET @query = 'SELECT * FROM #TempDB AS PivotData '
这样你就得到了:
SET @query = 'SELECT * INTO #TempDB4 FROM #TempDB AS PivotData '
或以相同的方式添加insert
。
要让不成功的查询按预期工作,您必须将其转换为动态SQL,就像成功查询一样,并使用exec
或sp_executesql