22,207
社区成员
发帖
与我相关
我的任务
分享
DECLARE @OrgXml XML = '<dbo.WorkOrderStrokeTask GID="1E8FE45C-09BC-4C88-8370-00002677704E" OpTime="2016-09-30T14:04:04.850" />
<dbo.WorkOrderStrokeTask GID="217FF216-C96E-4F9D-A719-000032C8B11A" OpTime="2018-02-08T10:50:42.090" />
<dbo.WorkOrderStrokeTask GID="11CB0F35-1979-469A-8D88-000040479A13" OpTime="2018-01-04T13:58:58.483" />' ,
@NewXml XML = '<dbo.WorkOrderStrokeTask GID="1E8FE45C-09BC-4C88-8370-00002677704E" OpTime="2016-09-30T14:04:04.850" />
<dbo.WorkOrderStrokeTask GID="217FF216-C96E-4F9D-A719-000032C8B11A" OpTime="2018-02-08T10:50:42.090" />
<dbo.WorkOrderStrokeTask GID="11CB0F35-1979-469A-8D88-000040479A13" OpTime="2018-01-05T13:58:38.400" />';
<dbo.WorkOrderStrokeTask GID="1E8FE45C-09BC-4C88-8370-00002677704E" StrokeGID="73D53AE3-C0D9-4124-BA30-BE6067F65729" TaskNo="20160929331790" VehicleGID="8366865A-9D7D-4FA5-AF7F-3B0177A37F73" VehicleCode="粤T41603" VehicleSeatCount="51" Driver1GID="95C3D27F-BC55-4B5B-B481-A83971CA79FA" Driver1Name="梁子财" OperGID="5BC4548A-8CC6-4EAC-8F1C-29041AA519B3" OperCode="1121" OperName="李炳" OpTime="2016-09-30T14:04:04.850" ………………
DECLARE @TSql NVARCHAR(MAX) = '' ,@CaseSql NVARCHAR(MAX) = '';
SELECT @TSql += N'[' + A.ElKey + N'] = T.C.value(''(@' + A.ElKey+ N')[1]'', ''VARCHAR(MAX)''),' ,
@CaseSql += N'CASE WHEN A.[' + A.ElKey + N'] <> ' + N'B.[' + A.ElKey+ N'] THEN ''' + A.ElKey + N':'' + A.[' + A.ElKey+ N'] + ''→'' + B.[' + A.ElKey + N'] ELSE '''' END +'
FROM ( SELECT DISTINCT ElKey = T.C.value('local-name(.)', 'VARCHAR(MAX)') FROM @OrgXml.nodes('/*/@*') T(C) ) AS A;
SET @TSql = LEFT(@TSql, LEN(@TSql) - 1);SET @CaseSql = LEFT(@CaseSql, LEN(@CaseSql) - 1);
SET @TSql = N'SELECT * FROM ( SELECT A.GID,ChangeStr = ' + @CaseSql+ N' FROM ( SELECT ' + @TSql+ N' FROM @OrgXml.nodes(''/*'') T(C) ) AS A INNER JOIN (SELECT '+ @TSql+ N' FROM @NewXml.nodes(''/*'') T(C) ) AS B ON A.GID = B.GID) AS C WHERE C.ChangeStr <> ''''';
EXEC sys.sp_executesql @statement = @TSql , @params = N'@OrgXml XML,@NewXml XML' , @OrgXml = @OrgXml ,@NewXml = @NewXml;
<dbo.LineClassTicketDetail GID="9087C33B-FE9F-46FF-A586-00000360C53B" OpTime="2018-05-25T15:23:51" ClassDate="2018-05-25T00:00:00" ClassTime="18:15" />
<dbo.Line GID="1C76A3D2-2EB7-4A80-9C76-000B1D0B84E0" LineCode="2004" LineName="英德大镇--罗冲围" />
select 差异 = CASE
WHEN A.gid IS NULL THEN '@OrgXml 中不存在'
WHEN B.gid IS NULL THEN '@NewXml 中不存在'
WHEN A.ClassTime <> B.ClassTime THEN 'ClassTime 不同'
ELSE ''
END
,*
from(
SELECT T.C.value('@GID', 'uniqueidentifier') as gid,
T.C.value('@ClassTime', 'time') as ClassTime
FROM @OrgXml.nodes('/*') T(C)
) a full join(
SELECT T.C.value('@GID', 'uniqueidentifier') as gid,
T.C.value('@ClassTime', 'time') as ClassTime
FROM @NewXml.nodes('/*') T(C)
) b on a.gid=b.gid
DECLARE @OrgXml XML = '<dbo.LineDayClass GID="05FF8AFC-5FE1-4ED1-9BDE-000001B1AC37" ClassTime="10:30" />
<dbo.LineDayClass GID="3733F943-CEB2-45E1-9A9B-00005E00FE0F" ClassTime="14:00" />
<dbo.LineDayClass GID="5F083963-AD3F-4B0D-A06A-0000B569E94A" ClassTime="16:55" />' ,
@NewXml XML = '<dbo.LineDayClass GID="05FF8AFC-5FE1-4ED1-9BDE-000001B1AC37" ClassTime="10:30" />
<dbo.LineDayClass GID="3733F943-CEB2-45E1-9A9B-00005E00FE0F" ClassTime="14:00" />
<dbo.LineDayClass GID="5F083963-AD3F-4B0D-A06A-0000B569E94A" ClassTime="17:55" />';
SELECT T.C.value('.', 'VARCHAR(MAX)') ,
T.C.value('local-name(.)', 'VARCHAR(MAX)')
FROM @OrgXml.nodes('/*/@*') T(C);
SELECT T.C.value('.', 'VARCHAR(MAX)') ,
T.C.value('local-name(.)', 'VARCHAR(MAX)')
FROM @NewXml.nodes('/*/@*') T(C);
select 差异 = CASE
WHEN A.gid IS NULL THEN '@OrgXml 中不存在'
WHEN B.gid IS NULL THEN '@NewXml 中不存在'
WHEN A.value <> B.value THEN 'Value 不同'
ELSE ''
END
,*
from(
SELECT
T.C.value('../@GID', 'uniqueidentifier') as gid,
T.c.value('local-name(.)', 'sysname') as name,
T.C.value('.', 'nvarchar(max)') as value
FROM @OrgXml.nodes('/*/@*[local-name() != "GID"]') T(C)
) a full join(
SELECT
T.C.value('../@GID', 'uniqueidentifier') as gid,
T.c.value('local-name(.)', 'sysname') as name,
T.C.value('.', 'nvarchar(max)') as value
FROM @NewXml.nodes('/*/@*[local-name() != "GID"]') T(C)
) b on a.gid=b.gid and a.name = b.name
select 差异 = CASE
WHEN A.gid IS NULL THEN '@OrgXml 中不存在'
WHEN B.gid IS NULL THEN '@NewXml 中不存在'
WHEN A.value <> B.value THEN 'ClassTime 不同'
ELSE ''
END
,*
from(
SELECT T.C.value('@GID', 'uniqueidentifier') as gid,
CONVERT(nvarchar(max), T.c.query('<v>{./@*[local-name() != "GID"]}</v>')) as value
FROM @OrgXml.nodes('/*') T(C)
) a full join(
SELECT T.C.value('@GID', 'uniqueidentifier') as gid,
CONVERT(nvarchar(max), T.c.query('<v>{./@*[local-name() != "GID"]}</v>')) as value
FROM @NewXml.nodes('/*') T(C)
) b on a.gid=b.gid