Преобразуйте подвыбор набора результатов в T-SQL в JSON, используя «для json auto» - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть триггер, который срабатывает при вставке в мой стол.Я хочу иметь возможность сериализовать каждую строку в наборе результатов inserted и вставить ее как столбец «JsonValue» в другую таблицу, а также некоторые другие значения в новую таблицу.В настоящее время триггер выглядит примерно так:

create trigger dbo.InsertContactAudit
on Contact
   after insert
as
begin
    set nocount on;
    insert into ContactAudit (
        JsonMessage, EventType, ContactId, ProjectId, CorrelationId
    )
    select 'entire row serialized to json', 'create', inserted.ContactId, inserted.ProjectId, inserted.CorrelationId
    from Contact inserted;

Часть, с которой у меня возникли проблемы, это 'entire row to json here'.В подобной ситуации я мог бы сделать что-то вроде:

select column1, column2, column3 from table for json auto;

, и это дало бы мне что-то похожее на { "column1": "value 1", "column2", "value2", ... }

Есть ли способ получить желаемое поведение?Сериализовать всю строку в json, вставляя в другие столбцы внутри триггера?

1 Ответ

1 голос
/ 24 сентября 2019

Есть ли конкретная причина, по которой вы хотите использовать JSON AUTO?

Для достижения требуемого формата JSON с набором столбцов для каждой строки в своем собственном BLOB-объекте JSON без окружения [] символов, вы можете сделать что-то вроде этого ...

use master
go
if exists(select * from sys.databases where name='StackOverflow')
    drop database StackOverflow
go
create database StackOverflow
go
use StackOverflow;
create table dbo.Contact (
    ContactId int not null identity,
    ProjectId int,
    CorrelationId int,
    Column1 nvarchar(20),
    Column2 nvarchar(20),
    Column3 nvarchar(20)
);
create table dbo.ContactAudit (
    JsonMessage nvarchar(max),
    EventType nvarchar(20),
    ContactId int not null,
    ProjectId int,
    CorrelationId int
);
go
create trigger dbo.InsertContactAudit on dbo.Contact
after insert as
begin
    set nocount on;
    insert into dbo.ContactAudit (JsonMessage, EventType, ContactId, ProjectId, CorrelationId)
        select (
        select ContactId, ProjectId, CorrelationId, Column1, Column2, Column3
        for json path, without_array_wrapper
        ), 'create', ContactId, ProjectId, CorrelationId
        from inserted;
end
go
insert Contact (ProjectId, CorrelationId, Column1, Column2, Column3)
    values (null, null, null, null, null);
insert Contact (ProjectId, CorrelationId, Column1, Column2, Column3)
    values (1, 2, 'Foo', 'Bar', 'Baz');
select * from dbo.ContactAudit;
go

Что бы записать следующее в dbo.ContactAudit ...

JsonMessage                                                                                     EventType            ContactId   ProjectId   CorrelationId
----------------------------------------------------------------------------------------------- -------------------- ----------- ----------- -------------
{"ContactId":1}                                                                                 create               1           NULL        NULL
{"ContactId":2,"ProjectId":1,"CorrelationId":2,"Column1":"Foo","Column2":"Bar","Column3":"Baz"} create               2           1           2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...