SQL-SERVER选择UPDATE OUTPUT作为XML

时间:2018-02-05 08:59:42

标签: sql-server xml sql-update

在SQL Server 2016上运行。

我有一个例程来更新服务器之间的信息。我想要列出我需要做出的任何更改。我试图将更改的列作为XML输出用于基本存储,并且如果可能的话,希望直接从插入/更新/删除生成的OUTPUT中执行此操作。

举个例子:

DROP TABLE IF EXISTS Test
CREATE TABLE Test (myKey INT, myValue INT)
INSERT INTO dbo.Test (myKey, myValue)
VALUES (1, 1), (2, 2), (3, 3)

UPDATE  dbo.Test
SET     myValue = myValue + 10
OUTPUT  Deleted.*
,       Inserted.*
WHERE   myKey < 3

SELECT  *
FROM    dbo.Test
FOR     XML AUTO

DROP TABLE dbo.Test

我知道我可以设置一个TVP来接收输出,然后从那里转换为XML,但似乎我正在采取额外的步骤来做一些应该非常直接的事情。

DROP TABLE IF EXISTS Test
CREATE TABLE Test (myKey INT, myValue INT)
INSERT INTO dbo.Test (myKey, myValue)
VALUES (1, 1), (2, 2), (3, 3)

DECLARE @OutputValues AS TABLE(dMyKey INT, dMyValue INT, iMyKey INT, iMyValue INT)

UPDATE  dbo.Test
SET     myValue = myValue + 10
OUTPUT  Deleted.myKey 
,       Deleted.myValue 
,       Inserted.myKey 
,       Inserted.myValue 
        INTO    @OutputValues
WHERE   myKey < 3

SELECT  *
FROM    @OutputValues
FOR     XML AUTO

DROP TABLE dbo.Test 

虽然第二段代码确实达到了我想要的那种输出,但通过TVP看起来有点浪费。

如果我可以直接将原始代码的输出格式化为XML,我觉得这将是一个更好的解决方案。但是,我看不出这样做的方法。

非常感谢。

1 个答案:

答案 0 :(得分:0)

你想要达到什么目的?这样的监控/审计任务最有可能在触发器中得到更好的解决......

输出子句不允许子选择...唯一的方法 - 不是通用的而且相当丑陋 - 我想到的是(线索是来自{{1的隐式演员转到nvarchar):

xml

关注:如果您的值包含禁用字符(例如CREATE TABLE Test (myKey INT, myValue INT) INSERT INTO dbo.Test (myKey, myValue) VALUES (1, 1), (2, 2), (3, 3) DECLARE @OutputValues AS TABLE(dMyKey INT, dMyValue INT, iMyKey INT, iMyValue INT,Changed XML) UPDATE dbo.Test SET myValue = myValue + 10 OUTPUT Deleted.myKey , Deleted.myValue , Inserted.myKey , Inserted.myValue , N'<root><deletedKey>' + CAST(deleted.myKey AS NVARCHAR(MAX)) + N'</deletedKey>' + N'<deletedValue>' + CAST(deleted.myValue AS NVARCHAR(MAX)) + N'</deletedValue>' + N'<insertedKey>' + CAST(inserted.myValue AS NVARCHAR(MAX)) + N'</insertedKey>' + N'<insertedValue>' + CAST(inserted.myValue AS NVARCHAR(MAX)) + N'</insertedValue>' + N'</root>' INTO @OutputValues WHERE myKey < 3 SELECT Changed FROM @OutputValues DROP TABLE dbo.Test ),则会失败!