不幸的是,我一直坚持这个项目的方式。我需要做的是拿一张大约有100个字段的表格,比较两个记录,确定哪些字段不匹配。SQL Server数据透视/不透视整个表格(100+个字段)
我能想到的是转动他们的最好办法,所以这个:
KeyID Field1 Field2 Field3 Field4 Field5 Field6
42 Apples Pears Blue Hills Dog iPhone
65 Apples Plums Red Hills Cat iPhone
变成这样:
FieldName KeyID_42 KeyID_65
Field1 Apples Apples
Field2 Pears Plums
Field3 Blue Red
Field4 Hills Hills
Field5 Dog Cat
Field6 iPhone iPhone
,然后我可以运行对像的查询:
我应该留下这个:
FieldName KeyID_42 KeyID_65
Field2 Pears Plums
Field3 Blue Red
Field5 Dog Cat
但是,对于包含100个左右字段的表格,在PIVOT语句中列出它们中的每一个都不会很漂亮。我可能不得不在稍后的另一张桌子上做这个。
有没有简单的方法来实现这一目标?一个不需要单独列出每个字段?
编辑:
我在这一点上,但越来越多的错误是这样的:Invalid column name 'UpdateTime'.
我正在使用的代码是这样的:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsUnpivot
= stuff((select ','+quotename(C.name)
FROM sys.columns c
WHERE c.object_id = OBJECT_ID('dbo.tblSQLAdminInventory')
--AND C.Name <> 'EffectiveDate'
for xml path('')), 1, 1, '')
set @query
= 'select KeyID, ID1, ID2
from tblSQLAdminInventory
unpivot
(
KeyID
for ID1 in ('+ @colsunpivot +')
) u
unpivot
(
KeyID
for ID2 in ('+ @colsunpivot +')
) u
'
exec sp_executesql @query;
没有列出所有领域,你需要使用'动态sql'去解决你的结果。 SO的几个例子就是这样做的。 – sgeddes
Double unpivot不会诀窍。为什么不转光两次? –
Where子句总是WHERE KeyID_42 <> KeyID_65,或者这也需要动态化吗? –