Compare deleted and inserted table in SQL Server 2008

后端 未结 4 631
迷失自我
迷失自我 2020-12-21 16:56

I am new to SQL Server 2008 and I need advice from all of you. I want to find out the changed value in inserted and deleted tables of the SQL Serve

4条回答
  •  春和景丽
    2020-12-21 17:11

    You could make a dynamic "comparer" by converting the inserted and deleted tables into 2 xml, iterating through the properties and comparing the xml value.

    Example:

    CREATE TRIGGER MY_COMPARER
       ON TABLE_NAME
       AFTER UPDATE
    AS
    BEGIN
        DECLARE @columnIndex INT = 1;
        DECLARE @maxColumns INT = (select count(*) from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TABLE_NAME');
        DECLARE @insertedXML XML = (select top 1 * from INSERTED FOR XML PATH('ROOT'), ELEMENTS XSINIL);
        DECLARE @deletedXML XML = (select top 1 * from DELETED FOR XML PATH('ROOT'), ELEMENTS XSINIL);
    
        WHILE @columnIndex <= @maxColumns BEGIN 
            DECLARE @insertedXMLValue XML = (select @insertedXML.query('/ROOT/*[sql:variable("@columnIndex")]'));
            DECLARE @deletedXMLValue XML = (select @deletedXML.query('/ROOT/*[sql:variable("@columnIndex")]'));
    
            DECLARE @insertedValue NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX), @insertedXMLProp);
            DECLARE @deletedValue NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX), @deletedXMLProp);
    
            IF (@insertedValue != @deletedValue)
                print('Column: ' + CONVERT(NVARCHAR(MAX), @columnIndex) + ' has changed')
    
            SET @columnIndex = @columnIndex + 1;
        END
    END
    

提交回复
热议问题