は、いくつかの戦略的な解析/スプリット操作で行うことができます
サンプルデータ
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
これは、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
@SqlZimありがとうございます。私はその提案を見たことがあるが、それは私が探しているものではない(おそらく私はそれを完全に理解していない)。2つの主な理由:(1)実際に必要なもの(おそらくは最初の要素)に関係なく、JSON全体を処理します。(2)JSONを一種のTABLEに変換します。 JSONに、たとえば配列内の配列内の配列など、6つの異なるレベルの階層があるとします。 – FDavidov