Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Santa89 Member Откуда: Сообщений: 1497 |
Всем привет! Есть очень сильно изменяющаяся структура JSON (разные уровни вложенности, названия, итд). JSON такого вида: [{ "-join": "left", "-type": "join", "clause": { "-type": "join", "expression": { "-op": "AND", "expression": [ { "-op": "=", "expression": [ { "-op": "[tbl_2_3_EN].[Version_ID]" }, { "-op": "[tbl_2_2_EN].[Version_ID]" } ] }, { "-op": "=", "expression": [ { "-op": "[tbl_2_3_EN].[uda_3_54]" }, { "-op": "[tbl_2_2_EN].[ID]" } ] } ] } }, "relation": [ { "-connection": "sqlserver.19z8ndd0q9wa081bnydlk0flgbi3", "-name": "tbl_2_3_EN", "-table": "[mdm].[tbl_2_3_EN]", "-type": "table" }, { "-connection": "sqlserver.19z8ndd0q9wa081bnydlk0flgbi3", "-name": "tbl_2_2_EN", "-table": "[mdm].[tbl_2_2_EN]", "-type": "table" } ]}] Вопрос: мне нужно найти все сочетания атрибутов "-connection","-name","-table","-type". средствами парсинга JSON на SQL Server 2016 такого сделать вряд-ли получится, т.к. повторюсь - очень сильно изменяющаяся структура. Планирую делать через поиск в строке. Т.е. на выходе должна получится табличка типа: |-connection||-name||-table||-type| |sqlserver.19z8ndd0q9wa081bnydlk0flgbi3||tbl_2_3_EN||[mdm].[tbl_2_2_EN]||table| |sqlserver.19z8ndd0q9wa081bnydlk0flgbi3||tbl_2_2_EN||[mdm].[tbl_2_2_EN]||table| Как это можно было бы сделать? |
29 мар 19, 15:37 [21847243] Ответить | Цитировать Сообщить модератору |
Santa89 Member Откуда: Сообщений: 1497 |
Для лучшего понимания, каким разнообразным может быть уровень вложенности элемента "relation" привожу пример JSON сгенерённого для другого элемента данных:DECLARE @JSON VARCHAR(MAX) = '{ "-join": "inner", "-type": "join", "clause": { "-type": "join", "expression": { "-op": "AND", "expression": [ { "-op": "=", "expression": [ { "-op": "[region].[Version_ID]" }, { "-op": "[country].[Version_ID]" } ] }, { "-op": "=", "expression": [ { "-op": "[region].[uda_5_257]" }, { "-op": "[country].[ID]" } ] } ] } }, "relation": [ { "-join": "inner", "-type": "join", "clause": { "-type": "join", "expression": { "-op": "AND", "expression": [ { "-op": "=", "expression": [ { "-op": "[city].[Version_ID]" }, { "-op": "[region].[Version_ID]" } ] }, { "-op": "=", "expression": [ { "-op": "[city].[uda_6_258]" }, { "-op": "[region].[ID]" } ] } ] } }, "relation": [ { "-join": "inner", "-type": "join", "clause": { "-type": "join", "expression": { "-op": "=", "expression": [ { "-op": "[MDS_Fact_Table_For_Hierarchies].[location_id]" }, { "-op": "[city].[ID]" } ] } }, "relation": [ { "-connection": "sqlserver.0d73hc20uzjr801ezwenn1dpyfz1", "-name": "MDS_Fact_Table_For_Hierarchies", "-table": "[_del].[MDS_Fact_Table_For_Hierarchies]", "-type": "table" }, { "-connection": "sqlserver.0d73hc20uzjr801ezwenn1dpyfz1", "-name": "city", "-table": "[mdm].[tbl_3_6_EN]", "-type": "table" } ] }, { "-connection": "sqlserver.0d73hc20uzjr801ezwenn1dpyfz1", "-name": "region", "-table": "[mdm].[tbl_3_5_EN]", "-type": "table" } ] }, { "-connection": "sqlserver.0d73hc20uzjr801ezwenn1dpyfz1", "-name": "country", "-table": "[mdm].[tbl_3_4_EN]", "-type": "table" } ] }' SELECT @JSON |
29 мар 19, 15:44 [21847255] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
https://docs.microsoft.com/en-us/sql/relational-databases/json/json-path-expressions-sql-server?view=sql-server-2017 |
29 мар 19, 17:21 [21847400] Ответить | Цитировать Сообщить модератору |
Santa89 Member Откуда: Сообщений: 1497 |
Вроде бы вопрос упростился. Теперь есть такая XML:<relation join="inner" type="join"> <clause type="join"> <expression op="AND"> <expression op="="> <expression op="[region].[Version_ID]" /> <expression op="[country].[Version_ID]" /> </expression> <expression op="="> <expression op="[region].[uda_5_257]" /> <expression op="[country].[ID]" /> </expression> </expression> </clause> <relation join="inner" type="join"> <clause type="join"> <expression op="AND"> <expression op="="> <expression op="[city].[Version_ID]" /> <expression op="[region].[Version_ID]" /> </expression> <expression op="="> <expression op="[city].[uda_6_258]" /> <expression op="[region].[ID]" /> </expression> </expression> </clause> <relation join="inner" type="join"> <clause type="join"> <expression op="="> <expression op="[MDS_Fact_Table_For_Hierarchies].[location_id]" /> <expression op="[city].[ID]" /> </expression> </clause> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="MDS_Fact_Table_For_Hierarchies" table="[_del].[MDS_Fact_Table_For_Hierarchies]" type="table" /> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="city" table="[mdm].[tbl_3_6_EN]" type="table" /> </relation> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="region" table="[mdm].[tbl_3_5_EN]" type="table" /> </relation> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="country" table="[mdm].[tbl_3_4_EN]" type="table" /> </relation> <relation join="inner" type="join"> <clause type="join"> <expression op="AND"> <expression op="="> <expression op="[city].[Version_ID]" /> <expression op="[region].[Version_ID]" /> </expression> <expression op="="> <expression op="[city].[uda_6_258]" /> <expression op="[region].[ID]" /> </expression> </expression> </clause> <relation join="inner" type="join"> <clause type="join"> <expression op="="> <expression op="[MDS_Fact_Table_For_Hierarchies].[location_id]" /> <expression op="[city].[ID]" /> </expression> </clause> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="MDS_Fact_Table_For_Hierarchies" table="[_del].[MDS_Fact_Table_For_Hierarchies]" type="table" /> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="city" table="[mdm].[tbl_3_6_EN]" type="table" /> </relation> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="region" table="[mdm].[tbl_3_5_EN]" type="table" /> </relation> <relation join="inner" type="join"> <clause type="join"> <expression op="="> <expression op="[MDS_Fact_Table_For_Hierarchies].[location_id]" /> <expression op="[city].[ID]" /> </expression> </clause> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="MDS_Fact_Table_For_Hierarchies" table="[_del].[MDS_Fact_Table_For_Hierarchies]" type="table" /> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="city" table="[mdm].[tbl_3_6_EN]" type="table" /> </relation> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="MDS_Fact_Table_For_Hierarchies" table="[_del].[MDS_Fact_Table_For_Hierarchies]" type="table" /> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="city" table="[mdm].[tbl_3_6_EN]" type="table" /> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="region" table="[mdm].[tbl_3_5_EN]" type="table" /> <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="country" table="[mdm].[tbl_3_4_EN]" type="table" /> <relation join="left" type="join"> <clause type="join"> <expression op="AND"> <expression op="="> <expression op="[tbl_2_3_EN].[Version_ID]" /> <expression op="[tbl_2_2_EN].[Version_ID]" /> </expression> <expression op="="> <expression op="[tbl_2_3_EN].[uda_3_54]" /> <expression op="[tbl_2_2_EN].[ID]" /> </expression> </expression> </clause> <relation connection="sqlserver.19z8ndd0q9wa081bnydlk0flgbi3" name="tbl_2_3_EN" table="[mdm].[tbl_2_3_EN]" type="table" /> <relation connection="sqlserver.19z8ndd0q9wa081bnydlk0flgbi3" name="tbl_2_2_EN" table="[mdm].[tbl_2_2_EN]" type="table" /> </relation> <relation connection="sqlserver.19z8ndd0q9wa081bnydlk0flgbi3" name="tbl_2_3_EN" table="[mdm].[tbl_2_3_EN]" type="table" /> <relation connection="sqlserver.19z8ndd0q9wa081bnydlk0flgbi3" name="tbl_2_2_EN" table="[mdm].[tbl_2_2_EN]" type="table" /> Нужно вытащить из неё все тэги у которых есть атрибут Connection, там дальше уже просто будет. Но вот вопрос как их вытащить? Делаю: SELECT XMLData.query('//relation') FROM #XMLwithOpenXML WHERE XMLData.exist('/connection') <> 0 не получается... |
30 мар 19, 13:57 [21847785] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
select b.n.query('.') from #XMLwithOpenXML a cross apply a.XMLdata.nodes('//*[@connection]') b(n); |
30 мар 19, 14:54 [21847817] Ответить | Цитировать Сообщить модератору |
Santa89 Member Откуда: Сообщений: 1497 |
Да. оно! Спасибо |
30 мар 19, 16:51 [21847879] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |