在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,我觉得这将是一个更好的解决方案。但是,我看不出这样做的方法。
非常感谢。
答案 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
),则会失败!