4

我使用and语句中的OUTPUT子句来协议我的脚本对数据库所做的更改。出于记录目的,我想将该子句的输出展平为一个纯文本值,我可以将其插入到调试审计表的单个单元格中。UPDATEINSERTOUTPUT

我下定决心的唯一解决方案是手动连接所有输出字段,但由于其中一些可能是NULL我还必须在连接之前检查它,最终脚本看起来很难看。

有没有更简单、更优雅的方式将输出展平为纯文本,类似于使用 XML 子句的方式FOR XML

4

1 回答 1

1

试试这个——

ALTER TRIGGER dbo.[trg_IOIU_test]
   ON dbo.[vw_test]
   INSTEAD OF INSERT, UPDATE
AS
BEGIN
    SET NOCOUNT ON
    SET XACT_ABORT ON

    DECLARE
        @DocumentUID UNIQUEIDENTIFIER,
        @Date DATETIME

    DECLARE cur CURSOR FORWARD_ONLY READ_ONLY FOR
        SELECT DocumentUID, [Date]
        FROM INSERTED

    OPEN cur

    FETCH NEXT FROM cur INTO @DocumentUID, @Date

    WHILE @@FETCH_STATUS = 0 BEGIN

        DECLARE 
              @BeforeChange NVARCHAR(MAX)
            , @AfterChange NVARCHAR(MAX)

        SET @BeforeChange = (
            SELECT * 
            FROM DELETED 
            WHERE [DocumentUID] = @DocumentUID FOR XML RAW, ROOT
        )
        SET @AfterChange = (
            SELECT * 
            FROM INSERTED 
            WHERE [DocumentUID] = @DocumentUID FOR XML RAW, ROOT
        )

        -- insert/update statement

        EXEC dbo.[AddLog]
                @DocumentUID = @DocumentUID,
                @BeforeChange = @BeforeChange,
                @AfterChange = @AfterChange

        FETCH NEXT FROM cur INTO @DocumentUID, @Date
    END

    CLOSE cur
    DEALLOCATE cur

END
于 2013-06-03T11:10:55.303 回答