/*      ----------------------------------------------------------------------------------------------------

 

        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

 

 

+ Recent posts