본문 바로가기

SQL Server

JSON Insert Update Create Index

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