Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在将xml列拆分为行的同时从表和相对xml列中进行选择?_Sql_Sql Server_Xml_Tsql_Cross Apply - Fatal编程技术网

Sql 如何在将xml列拆分为行的同时从表和相对xml列中进行选择?

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

我有一个有两列的表T。 列A是varchar列,列B是XML列

在B列中的某个地方总是有以下父标记:。里面有很多。。。孩子们

我希望得到一个包含两列的结果集:

第1列应包含与A列相同的值; 第2列应包含一个。。。只有 例如,起始表T:

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> |
+-----+-----------------------------+