主要使用SQL Server 2016.
我有XML格式的数据可用,但我需要能够将这些数据连接到SQL Server数据库中的其他表.
我四处查看了一下,但我找到的示例在XML中使用了不同的数据布局.这些示例在文档中具有不同的 node 名称.我的XML有一个名为metadata
的 node ,它定义了每个数据item
的名称、数据类型和长度.在data
node 中,每个row
具有value
个 node ,其对应于metadata
个 node 中的item
个 node .另外,我的XML使用名称空间.我找到的例子中没有一个是这样的.我在完成的其他SQL/XML任务中遇到过命名空间方面的问题,所以这可能很重要.
我如何使用SQL来转换类似这样的内容...
<?xml version="1.0" encoding="utf-8"?>
<dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<!--
<dataset
xmlns="http://developer.cognos.com/schemas/xmldata/1/"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="http://developer.cognos.com/schemas/xmldata/1/ xmldata.xsd"
>
-->
<metadata>
<item name="Task" type="xs:string" length="-1"/>
<item name="Task Number" type="xs:string" length="-1"/>
<item name="Group" type="xs:string" length="-1"/>
<item name="Work Order" type="xs:string" length="-1"/>
</metadata>
<data>
<row>
<value>3361B11</value>
<value>1</value>
<value>01</value>
<value>MS7579</value>
</row>
<row>
<value>3361B11</value>
<value>2</value>
<value>50</value>
<value>MS7579</value>
</row>
<row>
<value>3361B11</value>
<value>3</value>
<value>02</value>
<value>JA0520</value>
</row>
</data>
</dataset>
...转换成表格格式,如...
Task | Task Number | Group | Work Order |
---|---|---|---|
3361B11 | 1 | 01 | MS7579 |
3361B11 | 2 | 50 | MS7579 |
3361B11 | 3 | 02 | JA0520 |
...这样我就可以把它和其他数据连接起来.
我认为第一步应该是查询metadata
个 node ,以获得列名、数据类型和长度.
输入(简而言之)
<?xml version="1.0" encoding="utf-8"?>
<dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<metadata>
<item name="Task" type="xs:string" length="-1"/>
<item name="Task Number" type="xs:string" length="-1"/>
<item name="Group" type="xs:string" length="-1"/>
<item name="Work Order" type="xs:string" length="-1"/>
</metadata>
</dataset>
输出
id | name | type | length |
---|---|---|---|
1 | Task | string | -1 |
2 | Task Number | string | -1 |
3 | Group | string | -1 |
4 | Work Order | string | -1 |
一旦获得,将使用这些值动态生成下一个部件.
如果它对摆弄有帮助,下面是一条产生所需结果的SQL语句:
with
xlTask as (
select *
from (
values
('3361B11', '1', '01', 'MS7579')
, ('3361B11', '2', '50', 'MS7579')
, ('3361B11', '3', '02', 'JA0520')
) q ([Task], [Task Number], [Group], [Work Order])
)
select *
from xlTask