2017-02-07 12 views
3

受信したJSONから受信し、消費する(つまり情報を抽出する)必要があるプロジェクトに取り組んでいます。使用しているSQL Serverの現在のバージョン(今後2年間は変更されません)は2012年です(これは、バージョン2016とは対照的です)。SQL Server 2012でJSONを使用する

私は、彼が優しくソースコードを提供してくれた人からの投稿を見ていますが、残念ながらそれを再度見つけることはできません。

解決方法はありますか?以下のJSONを持つ

アイデアのようなものを持っていることです

{ 
    "Obj1": { 
     "Obj1_S_1": [{ 
      "Obj1_S_1_S_1": "Blabla_1" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_2" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_3" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_4" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_5" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_6" 
     }] 
    }, 
    "Obj2": "This is a simple string", 
    "Obj3": "456.33" 
} 

私は、次の呼び出しを使用できます。

SET @My_Param = GET_JSON(@Source_JSON, '*.Obj1.Obj1_S_1[3].Obj1_S_1_S_1') ; 

を、私はに値'Blabla_4'になるだろう変数@My_Param

これは、OracleとMySQLでまったく同じ構文が使用されています。

具体的なニーズに対処するための提案は非常に高く評価されます。

+2

これは、2016年以前のJSONの消費を実装するために私が知っている最良のリソースです:[SQL ServerでのJSON文字列の消費 - Phil Factor](https://www.simple-talk.com/sql/t-sql-programming/ SQL ServerのクエリからJSONドキュメントを作成する - Phil Factor](https://www.simple-talk.com/sql/t-sql-programming/)、 SQL Server JSONからJSONへのテーブル - Phil Factor](https://www.simple-talk.com/blogs/) 、[SQL ServerのJSONからテーブルへのJSON - Phil Factor] SQL Serverのjson-to-table-and-table-to-json /) – SqlZim

+0

@SqlZimありがとうございます。私はその提案を見たことがあるが、それは私が探しているものではない(おそらく私はそれを完全に理解していない)。2つの主な理由:(1)実際に必要なもの(おそらくは最初の要素)に関係なく、JSON全体を処理します。(2)JSONを一種のTABLEに変換します。 JSONに、たとえば配列内の配列内の配列など、6つの異なるレベルの階層があるとします。 – FDavidov

答えて

0

は、いくつかの戦略的な解析/スプリット操作で行うことができます

サンプルデータ

Declare @S varchar(max) =' 
{ 
    "Obj1": { 
     "Obj1_S_1": [{ 
      "Obj1_S_1_S_1": "Blabla_1" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_2" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_3" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_4" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_5" 
     }, { 
      "Obj1_S_1_S_1": "Blabla_6" 
     }] 
    }, 
    "Obj2": "This is a simple string", 
    "Obj3": "456.33" 
} 
' 

--Clean-up JSON String and add '|||' as a standard delimeter 
Select @S = Replace(@S,MapFrm,MapTo) 
From (values ('"'  ,'') 
      ,(char(13),'|||') 
      ,(char(10),'|||') 
      ,('}'  ,'|||') 
      ,('{'  ,'|||') 
      ,('['  ,'|||') 
      ,(']'  ,'|||') 
     ) b (MapFrm,MapTo) 

パース/スプリットUDF

とオプション
Select Item = left(RetVal,charindex(':',RetVal+':')-1) 
     ,Value = ltrim(right(RetVal,len(RetVal)-charindex(':',RetVal+':'))) 
From [dbo].[udf-Str-Parse](@S,'|||') 
Where Len(IsNull(RetVal,' '))>1 
Order By RetSeq 

パース/スプリットUDFなしオプション

Select Item = left(RetVal,charindex(':',RetVal+':')-1) 
     ,Value = ltrim(right(RetVal,len(RetVal)-charindex(':',RetVal+':'))) 
From (
     Select RetSeq = Row_Number() over (Order By (Select null)) 
       ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
     From (Select x = Cast('<x>' + replace((Select replace(@S,'|||','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
     Cross Apply x.nodes('x') AS B(i) 
     ) A 
Where Len(IsNull(RetVal,' '))>1 
Order By RetSeq 

どちらに戻る

Item   Value 
Obj1  
Obj1_S_1  
Obj1_S_1_S_1 Blabla_1 
Obj1_S_1_S_1 Blabla_2 
Obj1_S_1_S_1 Blabla_3 
Obj1_S_1_S_1 Blabla_4 
Obj1_S_1_S_1 Blabla_5 
Obj1_S_1_S_1 Blabla_6 
Obj2   This is a simple string, 
Obj3   456.33 

UDF

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Thanks Shnugo for making this XML safe 
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',') 
を必要に応じて0
+0

あなたのポストのジョンにありがとうございますが、私はそれにはいくつかの問題があります:(1)あなたは '{'/'}'と '' '' '' ''を '||| 'に変更することを提案しており、 **構造**と**配列**(構造の可能性があります)の間。 (2)(例えば) 'Obj2'も' Obj1'のような配列で、両方の配列のそれぞれから特定の要素を釣り上げる必要があるという階層があるとします。任意のソリューション**は** JSONの元の構造を尊重しなければなりません。私はあなたの提案がどのようにそれを行うのか分かりません。おそらく、私は何かを欠いている...私は? – FDavidov

関連する問題