Compare two sets of XML data using XQuery in SQL Server

后端 未结 3 1603
野的像风
野的像风 2021-01-02 08:13

Suppose I store employee data in a xml column in my log table. Sometimes data is also updated in the xml column from a stored procedure.

He

3条回答
  •  一向
    一向 (楼主)
    2021-01-02 09:00

    I don't have the exact output you wanted - but at least you get a good comparison of old and new values:

    ;WITH OldData AS
    (
    SELECT 
        @XML1.value('(/NewDataSet/Employee/EmpID)[1]', 'int') AS 'EmpID',
        @XML1.value('(/NewDataSet/Employee/Name)[1]', 'varchar(50)') AS 'Name',
        @XML1.value('(/NewDataSet/Employee/DOB)[1]', 'datetime') AS 'DOB',
        @XML1.value('(/NewDataSet/Employee/DeptID)[1]', 'varchar(50)') AS 'DeptID',
        @XML1.value('(/NewDataSet/Employee/Salary)[1]', 'varchar(25)') AS 'Salary'
    ),
    NewData AS
    (
    SELECT 
        @XML2.value('(/NewDataSet/Employee/EmpID)[1]', 'int') AS 'EmpID',
        @XML2.value('(/NewDataSet/Employee/Name)[1]', 'varchar(50)') AS 'Name',
        @XML2.value('(/NewDataSet/Employee/DOB)[1]', 'datetime') AS 'DOB',
        @XML2.value('(/NewDataSet/Employee/DeptID)[1]', 'varchar(50)') AS 'DeptID',
        @XML2.value('(/NewDataSet/Employee/Salary)[1]', 'varchar(25)') AS 'Salary'
    )
    SELECT
        'Old values', od.*
    FROM OldData od
    UNION
    SELECT 'New values', nd.*
    FROM NewData nd
    

    Gives you an output of:

                EmpID  Name   DOB                       DeptID   Salary
    Old values  1005   keith  1981-12-02 00:00:00.000   ACC001   10,500
    New values  1006   keith  1981-05-02 00:00:00.000   ACC002   10,900
    

    SQL Server is great for storing and manipulating data - but presentation like this should be done in a front-end application (like an ASP.NET application) - not in T-SQL....

提交回复
热议问题