DECLARE @XML1 XML
DECLARE @XML2 XML
SET @XML1 =
'<NewDataSet>
<Employee>
<EmpID>1005</EmpID>
<Name> keith </Name>
<DOB>12/02/1981</DOB>
<DeptID>ACC001</DeptID>
<Salary>10,500</Salary>
</Employee>
</NewDataSet>'
SET @XML2 =
'<NewDataSet>
<Employee>
<EmpID>1006</EmpID>
<Name> keith </Name>
<DOB>05/02/1981</DOB>
<DeptID>ACC002</DeptID>
<Salary>10,900</Salary>
</Employee>
</NewDataSet>'
;WITH CTE1 AS (
SELECT EmpID = Node.Data.value('(EmpID)[1]', 'VARCHAR(MAX)')
, Name = Node.Data.value('(Name)[1]', 'VARCHAR(MAX)')
, DOB = Node.Data.value('(DOB)[1]', 'VARCHAR(MAX)')
, DeptID = Node.Data.value('(DeptID)[1]', 'VARCHAR(MAX)')
, Salary = Node.Data.value('(Salary)[1]', 'VARCHAR(MAX)')
FROM @XML1.nodes('/NewDataSet/Employee') Node(Data)
), CTE2 AS (
SELECT EmpID = Node.Data.value('(EmpID)[1]', 'VARCHAR(MAX)')
, Name = Node.Data.value('(Name)[1]', 'VARCHAR(MAX)')
, DOB = Node.Data.value('(DOB)[1]', 'VARCHAR(MAX)')
, DeptID = Node.Data.value('(DeptID)[1]', 'VARCHAR(MAX)')
, Salary = Node.Data.value('(Salary)[1]', 'VARCHAR(MAX)')
FROM @XML2.nodes('/NewDataSet/Employee') Node(Data)
)
SELECT OLD.VALUE, NEW.VALUE
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY KEYNAME) AS ID, VALUE
FROM ( SELECT * FROM CTE1
) AS T1 UNPIVOT (VALUE FOR KEYNAME IN (EmpID, Name, DOB, DeptID, Salary)) AS A
) OLD INNER JOIN (
SELECT ROW_NUMBER() OVER (ORDER BY KEYNAME) AS ID, VALUE
FROM ( SELECT * FROM CTE2
) AS T1 UNPIVOT (VALUE FOR KEYNAME IN (EmpID, Name, DOB, DeptID, Salary)) AS A
) NEW ON OLD.ID = NEW.ID AND OLD.VALUE<>NEW.VALUE