首页 > 解决方案 > 有没有办法打印出完整的合并脚本输出?

问题描述

我使用多个合并脚本进行 CI/CD 部署数据库。Dacpac 包含用于 Azure Devops Deploy Azure DB Task 的部署后脚本。该脚本是多个合并脚本的串联。我想以某种方式存储更新/删除/插入哪些记录的详细日志。在 azure 发布日志中,我只有一个信息,即执行了更新脚本(启用诊断后)。

每个合并脚本都是这样的:

MERGE INTO [Common].[Address] AS Target
USING (VALUES 
    (N'00000009-0000-0000-0000-000000000001', N'Sample Street', N'Warsaw', N'15-123', N'Mazowieckie', N'Poland')
)
AS Source ([Id], [Street], [City], [PostalCode], [Voivodeship], [Country])
ON Target.[Id] = Source.[Id]

-- update matched rows
WHEN MATCHED AND (
    [Target].[Street] != Source.[Street] OR 
    [Target].[City] != Source.[City] OR
    [Target].[PostalCode] != Source.[PostalCode] OR
    [Target].[Voivodeship] != Source.[Voivodeship] OR 
    [Target].[Country] != Source.[Country]
) THEN
UPDATE SET 
    [Street] = Source.[Street], 
    [City] = Source.[City], 
    [PostalCode] = Source.[PostalCode],
    [Voivodeship] = Source.[Voivodeship], 
    [Country] = Source.[Country]

-- insert new rows
WHEN NOT MATCHED BY TARGET THEN
INSERT ([Id], [Street], [City], [PostalCode], [Voivodeship], [Country])
VALUES (Source.[Id], Source.[Street], Source.[City], Source.[PostalCode], Source.[Voivodeship], Source.[Country])

OUTPUT $action, [deleted].*, [inserted].*;

在输出中,我有我需要的确切信息。

我可以创建专用临时表,列出所有需要的列,然后将输出插入到该表中。然后我可以对整个行集使用 FOR JSON 子句,并将其保存到另一个只有两列的日志表中:时间戳和 json 数据,或者直接打印出来。该解决方案的问题在于我有许多合并脚本,我不想为每个脚本创建专用表。有没有办法从 Output Clouse 初始化临时表?甚至直接将输出序列化为 JSON 格式的变量?

标签: sqlsql-scriptsdacpac

解决方案


推荐阅读