如何从名称相同的 XML 获取值
How to get values from a XML where the names are the same
我必须从 XML 文件创建一个 table。
问题是每个 ID 都可以有多个行。
所以 table 需要看起来像这样。
ID
ec_date
ec_description
ec_Type
ec_currency
54bd0b6f-693e-476f-a80e-0094de4cf3b4
27-July-2021
Reiskosten woon-werk
XP504
EUR
9adfe4dd-49be-48fb-a838-009e861be8bd
24-August-2021
reiskosten Alkmaar-Zaandam
XP502
EUR
9adfe4dd-49be-48fb-a838-009e861be8bd
26-August-2021
reiskosten Alkmaar-Zaandam
XP502
EUR
这是我的 XML 结构:
<Root>
<Data>
<Data>
<table>
<id>{54bd0b6f-693e-476f-a80e-0094de4cf3b4}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="27-July-2021" type="System.DateTime" />
<column name="ec_description" value="Reiskosten woon-werk" type="System.String" />
<column name="ec_Type" value="XP504" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>145.14</total>
<AddOnKey>0</AddOnKey>
<data />
<parameters />
</table>
</Data>
</Data>
<Data>
<Data>
<table>
<id>{9adfe4dd-49be-48fb-a838-009e861be8bd}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="24-August-2021" type="System.DateTime" />
<column name="ec_description" value="reiskosten Alkmaar-Zaandam" type="System.String" />
<column name="ec_Type" value="XP502" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
<row>
<columns>
<column name="ec_date" value="26-August-2021" type="System.DateTime" />
<column name="ec_description" value="reiskosten Alkmaar-Zaandam" type="System.String" />
<column name="ec_Type" value="XP502" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>8.82</total>
<AddOnKey>0</AddOnKey>
<data />
<parameters />
</table>
</Data>
</Data>
</Root>
到目前为止我已经尝试过这个查询:
DECLARE @XMLData XML = ('<Root>
<Data>
<Data>
<table>
<id>{54bd0b6f-693e-476f-a80e-0094de4cf3b4}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="27-July-2021" type="System.DateTime" />
<column name="ec_description" value="Reiskosten woon-werk" type="System.String" />
<column name="ec_Type" value="XP504" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>145.14</total>
<AddOnKey>0</AddOnKey>
<data />
<parameters />
</table>
</Data>
</Data>
<Data>
<Data>
<table>
<id>{9adfe4dd-49be-48fb-a838-009e861be8bd}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="24-August-2021" type="System.DateTime" />
<column name="ec_description" value="reiskosten Alkmaar-ZaandamXP502" type="System.String" />
<column name="ec_Type" value="XP502" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
<row>
<columns>
<column name="ec_date" value="26-August-2021" type="System.DateTime" />
<column name="ec_description" value="reiskosten Alkmaar-Zaandam" type="System.String" />
<column name="ec_Type" value="XP502" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>8.82</total>
<AddOnKey>0</AddOnKey>
<data />
<parameters />
</table>
</Data>
</Data>
</Root>')
SELECT top 2000
ID = id.value('(table/id)[1]', 'nvarchar(255)'),
ec_date = ColumnData.value('Column[1]', 'nvarchar(255)')
ec_description = ColumnData.value('Column[2]', 'nvarchar(255)')
FROM
@XMLData.nodes('/Root/Data/Data') AS XTbl(id)
CROSS APPLY
id.nodes('table/rows/row/columns') AS XTbl2(ColumnData)
结果是这样的:
|编号 | ec_date | ec_description |
| ------ | ------ | ------ |
| 54bd0b6f-693e-476f-a80e-0094de4cf3b4 |空 |空 |
| 9adfe4dd-49be-48fb-a838-009e861be8bd |空 |空 |
| 9adfe4dd-49be-48fb-a838-009e861be8bd |空 |空 |
当有多行链接到一个 ID 时,它会正确地生成多行。
我遇到的问题是我似乎无法从 XML 列中获取值。
请尝试以下解决方案。
它将从 SQL Server 2017 开始运行。
要点:
OUTER APPLY
模拟输入 XML. 中两个级别之间的 parent/child 关系
- XQuery
.nodes()
方法 XPath 表达式已适当调整。
- t1(p) 和 t2(c) 是父/子(一对多)关系结果集的别名。
- 高级
TRIM(...)
函数用于去除大括号。该功能是在 SQL Server 2017 中引入的。
SQL
DECLARE @XMLData XML =
N'<Root>
<Data>
<Data>
<table>
<id>{54bd0b6f-693e-476f-a80e-0094de4cf3b4}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="27-July-2021"
type="System.DateTime"/>
<column name="ec_description"
value="Reiskosten woon-werk"
type="System.String"/>
<column name="ec_Type" value="XP504"
type="System.String"/>
<column name="ec_currency" value="EUR"
type="System.String"/>
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>145.14</total>
<AddOnKey>0</AddOnKey>
<data/>
<parameters/>
</table>
</Data>
</Data>
<Data>
<Data>
<table>
<id>{9adfe4dd-49be-48fb-a838-009e861be8bd}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="24-August-2021"
type="System.DateTime"/>
<column name="ec_description"
value="reiskosten Alkmaar-ZaandamXP502"
type="System.String"/>
<column name="ec_Type" value="XP502"
type="System.String"/>
<column name="ec_currency" value="EUR"
type="System.String"/>
</columns>
</row>
<row>
<columns>
<column name="ec_date" value="26-August-2021"
type="System.DateTime"/>
<column name="ec_description"
value="reiskosten Alkmaar-Zaandam"
type="System.String"/>
<column name="ec_Type" value="XP502"
type="System.String"/>
<column name="ec_currency" value="EUR"
type="System.String"/>
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>8.82</total>
<AddOnKey>0</AddOnKey>
<data/>
<parameters/>
</table>
</Data>
</Data>
</Root>';
SELECT TRIM('{}' FROM p.value('(id/text())[1]', 'NVARCHAR(255)')) AS ID
, c.value('(column[@name="ec_date"]/@value)[1]', 'NVARCHAR(255)') AS ec_date
, c.value('(column[@name="ec_description"]/@value)[1]', 'NVARCHAR(255)') AS ec_description
, c.value('(column[@name="ec_Type"]/@value)[1]', 'NVARCHAR(255)') AS ec_Type
, c.value('(column[@name="ec_currency"]/@value)[1]', 'CHAR(3)') AS ec_currency
FROM @XMLData.nodes('/Root/Data/Data/table') AS t1(p)
OUTER APPLY p.nodes('rows/row/columns') AS t2(c);
输出
+--------------------------------------+----------------+---------------------------------+---------+-------------+
| ID | ec_date | ec_description | ec_Type | ec_currency |
+--------------------------------------+----------------+---------------------------------+---------+-------------+
| 54bd0b6f-693e-476f-a80e-0094de4cf3b4 | 27-July-2021 | Reiskosten woon-werk | XP504 | EUR |
| 9adfe4dd-49be-48fb-a838-009e861be8bd | 24-August-2021 | reiskosten Alkmaar-ZaandamXP502 | XP502 | EUR |
| 9adfe4dd-49be-48fb-a838-009e861be8bd | 26-August-2021 | reiskosten Alkmaar-Zaandam | XP502 | EUR |
+--------------------------------------+----------------+---------------------------------+---------+-------------+
我必须从 XML 文件创建一个 table。
问题是每个 ID 都可以有多个行。
所以 table 需要看起来像这样。
ID | ec_date | ec_description | ec_Type | ec_currency |
---|---|---|---|---|
54bd0b6f-693e-476f-a80e-0094de4cf3b4 | 27-July-2021 | Reiskosten woon-werk | XP504 | EUR |
9adfe4dd-49be-48fb-a838-009e861be8bd | 24-August-2021 | reiskosten Alkmaar-Zaandam | XP502 | EUR |
9adfe4dd-49be-48fb-a838-009e861be8bd | 26-August-2021 | reiskosten Alkmaar-Zaandam | XP502 | EUR |
这是我的 XML 结构:
<Root>
<Data>
<Data>
<table>
<id>{54bd0b6f-693e-476f-a80e-0094de4cf3b4}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="27-July-2021" type="System.DateTime" />
<column name="ec_description" value="Reiskosten woon-werk" type="System.String" />
<column name="ec_Type" value="XP504" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>145.14</total>
<AddOnKey>0</AddOnKey>
<data />
<parameters />
</table>
</Data>
</Data>
<Data>
<Data>
<table>
<id>{9adfe4dd-49be-48fb-a838-009e861be8bd}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="24-August-2021" type="System.DateTime" />
<column name="ec_description" value="reiskosten Alkmaar-Zaandam" type="System.String" />
<column name="ec_Type" value="XP502" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
<row>
<columns>
<column name="ec_date" value="26-August-2021" type="System.DateTime" />
<column name="ec_description" value="reiskosten Alkmaar-Zaandam" type="System.String" />
<column name="ec_Type" value="XP502" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>8.82</total>
<AddOnKey>0</AddOnKey>
<data />
<parameters />
</table>
</Data>
</Data>
</Root>
到目前为止我已经尝试过这个查询:
DECLARE @XMLData XML = ('<Root>
<Data>
<Data>
<table>
<id>{54bd0b6f-693e-476f-a80e-0094de4cf3b4}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="27-July-2021" type="System.DateTime" />
<column name="ec_description" value="Reiskosten woon-werk" type="System.String" />
<column name="ec_Type" value="XP504" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>145.14</total>
<AddOnKey>0</AddOnKey>
<data />
<parameters />
</table>
</Data>
</Data>
<Data>
<Data>
<table>
<id>{9adfe4dd-49be-48fb-a838-009e861be8bd}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="24-August-2021" type="System.DateTime" />
<column name="ec_description" value="reiskosten Alkmaar-ZaandamXP502" type="System.String" />
<column name="ec_Type" value="XP502" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
<row>
<columns>
<column name="ec_date" value="26-August-2021" type="System.DateTime" />
<column name="ec_description" value="reiskosten Alkmaar-Zaandam" type="System.String" />
<column name="ec_Type" value="XP502" type="System.String" />
<column name="ec_currency" value="EUR" type="System.String" />
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>8.82</total>
<AddOnKey>0</AddOnKey>
<data />
<parameters />
</table>
</Data>
</Data>
</Root>')
SELECT top 2000
ID = id.value('(table/id)[1]', 'nvarchar(255)'),
ec_date = ColumnData.value('Column[1]', 'nvarchar(255)')
ec_description = ColumnData.value('Column[2]', 'nvarchar(255)')
FROM
@XMLData.nodes('/Root/Data/Data') AS XTbl(id)
CROSS APPLY
id.nodes('table/rows/row/columns') AS XTbl2(ColumnData)
结果是这样的: |编号 | ec_date | ec_description | | ------ | ------ | ------ | | 54bd0b6f-693e-476f-a80e-0094de4cf3b4 |空 |空 | | 9adfe4dd-49be-48fb-a838-009e861be8bd |空 |空 | | 9adfe4dd-49be-48fb-a838-009e861be8bd |空 |空 |
当有多行链接到一个 ID 时,它会正确地生成多行。
我遇到的问题是我似乎无法从 XML 列中获取值。
请尝试以下解决方案。
它将从 SQL Server 2017 开始运行。
要点:
OUTER APPLY
模拟输入 XML. 中两个级别之间的 parent/child 关系
- XQuery
.nodes()
方法 XPath 表达式已适当调整。 - t1(p) 和 t2(c) 是父/子(一对多)关系结果集的别名。
- 高级
TRIM(...)
函数用于去除大括号。该功能是在 SQL Server 2017 中引入的。
SQL
DECLARE @XMLData XML =
N'<Root>
<Data>
<Data>
<table>
<id>{54bd0b6f-693e-476f-a80e-0094de4cf3b4}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="27-July-2021"
type="System.DateTime"/>
<column name="ec_description"
value="Reiskosten woon-werk"
type="System.String"/>
<column name="ec_Type" value="XP504"
type="System.String"/>
<column name="ec_currency" value="EUR"
type="System.String"/>
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>145.14</total>
<AddOnKey>0</AddOnKey>
<data/>
<parameters/>
</table>
</Data>
</Data>
<Data>
<Data>
<table>
<id>{9adfe4dd-49be-48fb-a838-009e861be8bd}</id>
<rows>
<row>
<columns>
<column name="ec_date" value="24-August-2021"
type="System.DateTime"/>
<column name="ec_description"
value="reiskosten Alkmaar-ZaandamXP502"
type="System.String"/>
<column name="ec_Type" value="XP502"
type="System.String"/>
<column name="ec_currency" value="EUR"
type="System.String"/>
</columns>
</row>
<row>
<columns>
<column name="ec_date" value="26-August-2021"
type="System.DateTime"/>
<column name="ec_description"
value="reiskosten Alkmaar-Zaandam"
type="System.String"/>
<column name="ec_Type" value="XP502"
type="System.String"/>
<column name="ec_currency" value="EUR"
type="System.String"/>
</columns>
</row>
</rows>
<key>DefaultKey</key>
<total>8.82</total>
<AddOnKey>0</AddOnKey>
<data/>
<parameters/>
</table>
</Data>
</Data>
</Root>';
SELECT TRIM('{}' FROM p.value('(id/text())[1]', 'NVARCHAR(255)')) AS ID
, c.value('(column[@name="ec_date"]/@value)[1]', 'NVARCHAR(255)') AS ec_date
, c.value('(column[@name="ec_description"]/@value)[1]', 'NVARCHAR(255)') AS ec_description
, c.value('(column[@name="ec_Type"]/@value)[1]', 'NVARCHAR(255)') AS ec_Type
, c.value('(column[@name="ec_currency"]/@value)[1]', 'CHAR(3)') AS ec_currency
FROM @XMLData.nodes('/Root/Data/Data/table') AS t1(p)
OUTER APPLY p.nodes('rows/row/columns') AS t2(c);
输出
+--------------------------------------+----------------+---------------------------------+---------+-------------+
| ID | ec_date | ec_description | ec_Type | ec_currency |
+--------------------------------------+----------------+---------------------------------+---------+-------------+
| 54bd0b6f-693e-476f-a80e-0094de4cf3b4 | 27-July-2021 | Reiskosten woon-werk | XP504 | EUR |
| 9adfe4dd-49be-48fb-a838-009e861be8bd | 24-August-2021 | reiskosten Alkmaar-ZaandamXP502 | XP502 | EUR |
| 9adfe4dd-49be-48fb-a838-009e861be8bd | 26-August-2021 | reiskosten Alkmaar-Zaandam | XP502 | EUR |
+--------------------------------------+----------------+---------------------------------+---------+-------------+