我使用and语句中的OUTPUT
子句来协议我的脚本对数据库所做的更改。出于记录目的,我想将该子句的输出展平为一个纯文本值,我可以将其插入到调试审计表的单个单元格中。UPDATE
INSERT
OUTPUT
我下定决心的唯一解决方案是手动连接所有输出字段,但由于其中一些可能是NULL
我还必须在连接之前检查它,最终脚本看起来很难看。
有没有更简单、更优雅的方式将输出展平为纯文本,类似于使用 XML 子句的方式FOR XML
?
我使用and语句中的OUTPUT
子句来协议我的脚本对数据库所做的更改。出于记录目的,我想将该子句的输出展平为一个纯文本值,我可以将其插入到调试审计表的单个单元格中。UPDATE
INSERT
OUTPUT
我下定决心的唯一解决方案是手动连接所有输出字段,但由于其中一些可能是NULL
我还必须在连接之前检查它,最终脚本看起来很难看。
有没有更简单、更优雅的方式将输出展平为纯文本,类似于使用 XML 子句的方式FOR XML
?
试试这个——
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