/* ----------------------------------------------------------------------------------------------------
JSON 테스트
- SELECT, UPDATE, INSERT
---------------------------------------------------------------------------------------------------- */
-- 테이블 생성
DROP TABLE IF EXISTS DBO.T1
GO
CREATE TABLE DBO.T1 (IDX INT IDENTITY NOT NULL, VAL INT)
GO
-- 데이터 넣기
SET NOCOUNT ON
INSERT INTO DBO.T1 DEFAULT VALUES;
GO 10
SET STATISTICS IO ON
SET STATISTICS PROFILE ON
-- JSON
DECLARE @STR NVARCHAR(MAX) =
N'[
{"idx":1,"val":1},
{"idx":2,"val":2},
{"idx":3,"val":3},
{"idx":4,"val":4},
{"idx":5,"val":5}
]'
/* --------------------------------------------------
SELECT
-------------------------------------------------- */
SELECT *
FROM OPENJSON(@STR)
WITH (
IDX INT '$.idx'
, VAL INT '$.val'
)
/*
SELECT * FROM OPENJSON(@STR) WITH ( IDX INT '$.idx' , VAL INT '$.val' )
|--Table-valued function
*/
/* --------------------------------------------------
UPDATE
-------------------------------------------------- */
UPDATE A
SET A.VAL = B.VAL
FROM DBO.T1 AS A
INNER JOIN (
SELECT *
FROM OPENJSON(@STR)
WITH (
IDX INT '$.idx'
, VAL INT '$.val'
)
) AS B ON B.IDX = A.IDX
/*
테이블 'T1'. 검색 수 1, 논리적 읽기 수 6, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'Worktable'. 검색 수 0, 논리적 읽기 수 0, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
UPDATE A SET A.VAL = B.VAL FROM DBO.T1 AS A INNER JOIN ( SELECT * FROM OPENJSON(@STR) WITH ( IDX INT '$.idx' , VAL INT '$.val' ) ) AS B ON B.IDX = A.IDX
|--Table Update(OBJECT:([DB_DEV].[dbo].[T1] AS [A]), SET:([DB_DEV].[dbo].[T1].[VAL] as [A].[VAL] = OPENJSON_EXPLICIT.[VAL]))
|--Sort(DISTINCT ORDER BY:([Bmk1000] ASC))
|--Nested Loops(Inner Join, OUTER REFERENCES:([A].[IDX]))
|--Table Scan(OBJECT:([DB_DEV].[dbo].[T1] AS [A]))
|--Filter(WHERE:([DB_DEV].[dbo].[T1].[IDX] as [A].[IDX]=OPENJSON_EXPLICIT.[IDX]))
|--Table-valued function
*/
/* --------------------------------------------------
INSERT
-------------------------------------------------- */
INSERT INTO DBO.T1 (VAL)
SELECT VAL
FROM OPENJSON(@STR)
WITH (
IDX INT '$.idx'
, VAL INT '$.val'
)
/*
테이블 'T1'. 검색 수 0, 논리적 읽기 수 5, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'Worktable'. 검색 수 1, 논리적 읽기 수 13, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
INSERT INTO DBO.T1 (VAL) SELECT VAL FROM OPENJSON(@STR) WITH ( IDX INT '$.idx' , VAL INT '$.val' )
|--Table Insert(OBJECT:([DB_DEV].[dbo].[T1]), SET:([DB_DEV].[dbo].[T1].[VAL] = OPENJSON_EXPLICIT.[VAL],[DB_DEV].[dbo].[T1].[IDX] = [Expr1003]))
|--Compute Scalar(DEFINE:([Expr1003]=getidentity((1565248631),(10),NULL)))
|--Table Spool
|--Table-valued function
*/
이럴바엔 JSON 안쓴다. XML 이 낫지...
-- 환경 : SQL Server 2016 std sp1 cu3