SQL Server
                
              JSON Insert Update Create Index
                DBASeoul
                 2023. 1. 10. 17:54
              
                          
            MSSQL 에서 JSON 데이터를 수정하는 방법입니다.
DROP TABLE dbo.Logs
create table dbo.Logs (
    _id bigint primary key identity,
    log nvarchar(max),
    dumy1 AS JSON_VALUE(log, '$.DUMY2'),
    index ix_severity (dumy1)
);
/*
경고! 비클러스터형 인덱스에 대한 최대 키 길이는 1700바이트입니다. 
인덱스 'ix_severity'의 최대 길이는 8000바이트입니다. 
큰 값을 조합한 일부 경우에는 삽입/업데이트 작업을 수행할 수 없습니다.
*/
DECLARE @vJson AS NVARCHAR(MAX)
SET @vJson = (SELECT top 100000 * FROM TEST1M FOR JSON AUTO)   
INSERT INTO dbo.Logs(LOG)
SELECT VALUE FROM OPENJSON(@vJson)
update statistics dbo.Logs
declare @DUMY1 nvarchar(10) = 'E3'
SELECT TOP 100 * fROM dbo.Logs WHERE dumy1 = @DUMY1
SELECT TOP 100 * fROM dbo.Logs WHERE JSON_VALUE(log, '$.DUMY2') = @DUMY1
dumy1, JSON_VALUE(log, '$.DUMY2') 2가지 쿼리 모두 인덱스 사용이 가능하다.

특정 노드의 데이터 수정이 가능하다.
CREATE PROCEDURE dbo.UpdateData(@Id int, @Property nvarchar(100), @Value  nvarchar(100))
--WITH SCHEMABINDING, NATIVE_COMPILATION
AS BEGIN
    --ATOMIC WITH (transaction isolation level = snapshot,  language = N'English')
    UPDATE dbo.Logs
    SET log = JSON_MODIFY(log, @Property, @Value)
    WHERE _id = @Id;
END
exec dbo.UpdateData @Id=1, @Property='$.DUMY2',@Value='A1'
select * from dbo.Logs