問題

私は値を抽出しようとしていますが、常にNULLを返します。

 DECLARE @TestTable TABLE
(
    JSON_Column NVARCHAR(MAX)
)

INSERT INTO @TestTable
VALUES
(
    (SELECT 111111 AS idTest1, 222222 AS idTest2 FOR JSON PATH)
);

SELECT 
    JSON_Column,
    JSON_VALUE(JSON_Column,'$.idTest1') AS idTest1,
    JSON_VALUE(JSON_Column,'$.idTest2') AS idTest2

FROM @TestTable
 

結果:

 [{"idTest1":111111,"idTest2":222222}]   NULL    NULL
 

期待される:

 [{"idTest1":111111,"idTest2":222222}]   111111  222222
 

  ベストアンサー

これは、JSONが期待どおりに動作しないという問題に見えます。

あなたのJSONは、idTest1idTest2の2つの値を含む配列です。配列エントリ内に値が存在するため、パス$.idTest1は機能しません。 JSON出力を見てください:

 [{"idTest1":111111,"idTest2":222222}]  -- The square brackets are a dead giveaway!
 

配列のために、パスを最初の要素の要素に変更する必要があります。

 SELECT JSON_Column,
       JSON_VALUE(JSON_Column,'$[0].idTest1') AS idTest1,
       JSON_VALUE(JSON_Column,'$[0].idTest2') AS idTest2
  FROM @TestTable
 

パスを$[0].idTest1に変更したことに注意してください。これにより、配列の最初の要素のidTest1値が選択されます。

ちなみに、厳密なパスマッチングが有効になっている場合、これによりエラーが発生する可能性があります(必要に応じて)。

作業中のフィドルはここでです。

  同じタグがついた質問を見る

jsonsql-serversql-server-2016