Sql 如何在将xml列拆分为行的同时从表和相对xml列中进行选择?
我有一个有两列的表T。 列A是varchar列,列B是XML列 在B列中的某个地方总是有以下父标记:。里面有很多。。。孩子们 我希望得到一个包含两列的结果集: 第1列应包含与A列相同的值; 第2列应包含一个。。。只有 例如,起始表T:Sql 如何在将xml列拆分为行的同时从表和相对xml列中进行选择?,sql,sql-server,xml,tsql,cross-apply,Sql,Sql Server,Xml,Tsql,Cross Apply,我有一个有两列的表T。 列A是varchar列,列B是XML列 在B列中的某个地方总是有以下父标记:。里面有很多。。。孩子们 我希望得到一个包含两列的结果集: 第1列应包含与A列相同的值; 第2列应包含一个。。。只有 例如,起始表T: Column A | Column B -------------------------------------------------------------------------- abc | <Documents><Docum
Column A | Column B
--------------------------------------------------------------------------
abc | <Documents><Document>Doc 1</Document><Document>Doc 2</Document></Documents>
但这并不奏效:
SELECT T.[Column A], T2.C.query('.')
FROM T
CROSS APPLY T.[Column B].nodes('*/Documents/*') as T2 (C)
那么如何获得预期的结果呢?下面是如何做到的
SQL
输出
SELECT T2.C.query('.')
FROM T
CROSS APPLY T.[Column B].nodes('*/Documents/*') as T (C)
SELECT T.[Column A], T2.C.query('.')
FROM T
CROSS APPLY T.[Column B].nodes('*/Documents/*') as T2 (C)
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID CHAR(3), xmldata XML);;
INSERT INTO @tbl (ID, xmldata)
VALUES
('abc', '<Documents><Document>Doc 1</Document><Document>Doc 2</Document></Documents>')
, ('xyz', '<Documents><Document>Doc 10</Document><Document>Doc 20</Document></Documents>');
-- DDL and sample data population, end
SELECT ID
, c.query('.') AS [Column 2]
FROM @tbl AS tbl
CROSS APPLY tbl.xmldata.nodes('//Documents/Document') AS t(c);
+-----+-----------------------------+
| ID | Column 2 |
+-----+-----------------------------+
| abc | <Document>Doc 1</Document> |
| abc | <Document>Doc 2</Document> |
| xyz | <Document>Doc 10</Document> |
| xyz | <Document>Doc 20</Document> |
+-----+-----------------------------+