数组中的MSSQL JSON数据

时间:2017-09-18 14:01:10

标签: sql-server json database tsql sql-server-2016

在Microsoft SQL Server中,我有一行使用JSON。喜欢这个



[
{"id":"_Diagnose","value":
	{"$type":"System.Collections.Generic.List`1[[x2.Data.DataAccess.Entity.Helper.XmlHelper.MedDokDiagnose, Data.DataAccess.Entity]], mscorlib","$values":
		[{"$type":"x2.Data.DataAccess.Entity.Helper.XmlHelper.MedDokDiagnose, Data.DataAccess.Entity","Icd":"G12.8","IcdBeschreibung":"Sonstige spinale Muskelatrophien und verwandte Syndrome","IcdNotationskennzeichen":null,"Erlaeuterung":null,"Ausnahmetatbestand":null,"Sicherheit":"G","Seitenlokalisation":null,"AbgesetztAm":null,"Warnings":[],"IdKategorieBevorAbgesetzt":null,"TnmStatus":null},
		{"$type":"x2.Data.DataAccess.Entity.Helper.XmlHelper.MedDokDiagnose, Data.DataAccess.Entity","Icd":"B15.9","IcdBeschreibung":"Virushepatitis A ohne Coma hepaticum","IcdNotationskennzeichen":null,"Erlaeuterung":null,"Ausnahmetatbestand":null,"Sicherheit":"G","Seitenlokalisation":"","AbgesetztAm":null,"Warnings":[],"IdKategorieBevorAbgesetzt":null,"TnmStatus":null}]}
}
]




我想要ICD的两个值。

我有一个像这样的SQL语句可以正常工作:

SELECT
DetailXml.value('shortinfo[1]', 'nvarchar(100)') as Text,
(select test_value from openjson(formularVariablen) 
with (test_id nvarchar(MAX) '$.id', test_value nvarchar(MAX) '$.value."$values"[0].Icd') where test_id = '_Diagnose') as ICD1,
(select test_value from openjson(formularVariablen) 
with (test_id nvarchar(MAX) '$.id', test_value nvarchar(MAX) '$.value."$values"[1].Icd') where test_id = '_Diagnose') as ICD2
from MedDok CROSS APPLY Detail.nodes('meddokformular') as SqlXml(DetailXml)
LEFT JOIN MedDokFormularVariable ON MedDok.Id=MedDokFormularVariable.Id_MedDok
where exists
(select * from openjson((select formularVariablen from MedDokFormularVariable where id_meddok = MedDok.ID)) 
with (test_id varchar(100) '$.id', test_value varchar(100) '$.value'))

但问题在于可能存在3个或更多ICD键值对。我想要他们所有人。我尝试了很多方法,但没有任何效果。

2 个答案:

答案 0 :(得分:0)

没有sql2016。但是让代码处理XML。

DECLARE @myDoc XML;
SET @myDoc = '<id>_Diagnose</id>        
            <value>
            <type>System.Collections.Generic.List`1[[x2.Data.DataAccess.Entity.Helper.XmlHelper.MedDokDiagnose, Data.DataAccess.Entity]], mscorlib</type>
            <values>
                <type>x2.Data.DataAccess.Entity.Helper.XmlHelper.MedDokDiagnose, Data.DataAccess.Entity</type>
                <Icd>G12.8</Icd>
                <IcdBeschreibung>Sonstige spinale Muskelatrophien und verwandte Syndrome</IcdBeschreibung>
                <IcdNotationskennzeichen />
                <Erlaeuterung />
                <Ausnahmetatbestand />
                <Sicherheit>G</Sicherheit>
                <Seitenlokalisation />
                <AbgesetztAm />
                <IdKategorieBevorAbgesetzt />
                <TnmStatus />
            </values>
            <values>
                <type>x2.Data.DataAccess.Entity.Helper.XmlHelper.MedDokDiagnose, Data.DataAccess.Entity</type>
                <Icd>B15.9</Icd>
                <IcdBeschreibung>Virushepatitis A ohne Coma hepaticum</IcdBeschreibung>
                <IcdNotationskennzeichen />
                <Erlaeuterung />
                <Ausnahmetatbestand />
                <Sicherheit>G</Sicherheit>
                <Seitenlokalisation></Seitenlokalisation>
                <AbgesetztAm />
                <IdKategorieBevorAbgesetzt />
                <TnmStatus />
            </values>
        </value>
    ';
SELECT @myDoc; 

-- BUILD XML
DECLARE @x XML;
SELECT @x =
(
    SELECT @myDoc.value('(/id)[1]', 'varchar(50)') AS ID,
           @myDoc.query('
            for $a in //values
            return <address 
                Icd="{$a/Icd}" 
                IcdBeschreibung="{$a/IcdBeschreibung}" 

            />
        ') FOR XML RAW
);
SELECT [Name] = T.Item.value('../@ID', 'varchar(20)'),
       street = T.Item.value('@Icd', 'varchar(20)'),
       city = T.Item.value('@IcdBeschreibung', 'varchar(20)')
FROM @x.nodes('//row/address') AS T(Item);    

答案 1 :(得分:0)

使用交叉应用到值列表。像这样:

select
    *
from OPENJSON(
'
[
{"id":"_Diagnose","value":
    {"$type":"System.Collections.Generic.List`1[[x2.Data.DataAccess.Entity.Helper.XmlHelper.MedDokDiagnose, Data.DataAccess.Entity]], mscorlib","$values":
        [{"$type":"x2.Data.DataAccess.Entity.Helper.XmlHelper.MedDokDiagnose, Data.DataAccess.Entity","Icd":"G12.8","IcdBeschreibung":"Sonstige spinale Muskelatrophien und verwandte Syndrome","IcdNotationskennzeichen":null,"Erlaeuterung":null,"Ausnahmetatbestand":null,"Sicherheit":"G","Seitenlokalisation":null,"AbgesetztAm":null,"Warnings":[],"IdKategorieBevorAbgesetzt":null,"TnmStatus":null},
        {"$type":"x2.Data.DataAccess.Entity.Helper.XmlHelper.MedDokDiagnose, Data.DataAccess.Entity","Icd":"B15.9","IcdBeschreibung":"Virushepatitis A ohne Coma hepaticum","IcdNotationskennzeichen":null,"Erlaeuterung":null,"Ausnahmetatbestand":null,"Sicherheit":"G","Seitenlokalisation":"","AbgesetztAm":null,"Warnings":[],"IdKategorieBevorAbgesetzt":null,"TnmStatus":null}]}
}
]
')
with
(
    [id] nvarchar(max), 
    [values] nvarchar(max) '$.value."$values"' AS JSON
) as a
CROSS APPLY OPENJSON([values])
WITH(
    [Icd] nvarchar(max), 
    [IcdBeschreibung] nvarchar(max)
    /* etc... */
) as b