【发布时间】:2020-06-12 07:08:40
【问题描述】:
环境:SQL Server 2016; “真实”数据的抽象示例。
从第一个查询到包含 XML 数据的表,我有一个包含以下列的 SQL 结果集:
- ID(整数)
- 名称 (XML)
- 时代 (XML)
- 值 (XML)
第 2-4 列包含多个 XML 格式的值,例如
姓名:
- 第 1 行:
<name>TestR1</name><name>TestR2</name>... - 第 2 行:
<name>TestS1</name><name>TestS2</name>...
次:
- 第 1 行:
<time>0.1</time><time>0.2</time>... - 第 2 行:
<time>-0.1</time><time>-0.2</time>...
价值观:
- 第 1 行:
<value>1.1</value><value>1.2</value>... - 第 2 行:
<value>-1.1</value><value>-1.2</value>...
所有 XML 列的 XML 包含完全相同数量的元素。
我现在想要的是创建一个具有以下输出的选择:
| ID | Name | Time | Value |
+----+--------+------+-------+
| 1 | TestR1 | 0.1 | 1.1 |
| 1 | TestR1 | 0.2 | 1.2 |
| .. | ...... | .... | ..... |
| 2 | TestS1 | -0.1 | -1.1 |
| 2 | TestS2 | -0.2 | -1.2 |
| .. | ...... | .... | ..... |
对于单列 CROSS APPLY 工作正常:
SELECT ID, N.value('.', 'nvarchar(50)') AS ExtractedName
FROM <source>
CROSS APPLY <source>.nodes('/name') AS T(N)
应用多个 CROSS APPLY 语句对我来说毫无意义。
我想如果我为每个列创建选择,然后生成单独的结果集并对所有结果集执行选择,它会起作用 但这很可能不是最佳解决方案,因为我正在为每个附加列复制选择。
任何关于如何设计这样的查询的建议将不胜感激!
【问题讨论】:
标签: sql-server xml tsql