【发布时间】:2014-01-28 18:03:17
【问题描述】:
我正在尝试在动态数据透视查询中使用临时表。我已经读过该过程将不起作用,因为临时表超出了范围,即使它是一个全局表。这对我来说很奇怪,因为它在 sql fiddle 中有效,但在 SQL Server 2012 中无效。如何编辑我的查询,以便它给我一个输出而不是(xxx 行受影响)?
这是我的查询:
SELECT cc.CaseCaseId AS CaseId, cc.Label AS CaseName, rce.EcoDate, cc.OperatorName, cc.State, cc.County, ei.IROR, rce.NDCash
into ##Temp2
FROM PhdRpt.ReportCaseList_542 AS rcl INNER JOIN
CaseCases AS cc ON rcl.CaseCaseId = cc.CaseCaseId INNER JOIN
PhdRpt.RptCaseEco_542 AS rce ON rcl.ReportRunCaseId = rce.ReportRunCaseId INNER JOIN
PhdRpt.EcoIndicators_542 AS ei ON rcl.ReportRunCaseId = ei.ReportRunCaseId
DECLARE @colsPivot AS NVARCHAR(MAX),
@colsUnpivot as NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(EcoDate)
from ##Temp2
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('##Temp2') and
C.name LIKE 'NDCash%'
for xml path('')), 1, 1, '')
set @query
= 'select *
from
(
select cc.CaseCaseId AS CaseId, cc.Label AS CaseName, rce.EcoDate, cc.OperatorName, cc.State, cc.County, ei.IROR, val, col
FROM ##Temp2
unpivot
(
val
for col in ('+ @colsunpivot +')
) u
) x1
pivot
(
max(val)
for EcoDate in ('+ @colspivot +')
) p'
exec(@query)
Drop table ##Temp2
这是表结构:
CaseId EcoDate NDCash
2 2003-01-01 26.6384943638238
2 2004-01-01 23.9534867373416
2 2005-01-01 25.9197356158675
2 2006-01-01 25.3280437702064
2 2007-01-01 24.9828609298022
2 2008-01-01 26.4019321789285
2 2009-01-01 26.6384943638238
2 2010-01-01 24.0660715481002
2 2011-01-01 26.6384943638238
2 2012-01-01 22.5718444448345
2 2013-01-01 26.6384943638238
【问题讨论】:
-
使用 ##global 临时表的一个更直接的问题是,这实际上将并发限制为 1。当两个用户同时运行此代码时,您认为会发生什么?
-
@AaronBertrand 您有什么建议作为解决方案?我是 SQL 新手,因此不胜感激。
-
我什至没有尝试消化你的问题。我只知道全局##temp 表很少是正确的解决方案。
标签: sql-server pivot unpivot