Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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 server 如何将xml节点中的数据提取为列中的表?_Sql Server_Xml_Tsql - Fatal编程技术网

Sql server 如何将xml节点中的数据提取为列中的表?

Sql server 如何将xml节点中的数据提取为列中的表?,sql-server,xml,tsql,Sql Server,Xml,Tsql,我在SQLServer中有一个带有xml列的表,我的目标是将整个xml数据提取为表 假设我的桌子是这样的: CREATE TABLE Archive ( [Id] INT IDENTITY, [Timestamp] DATETIME, [XmlDoc] XML, [Description] NVARCHAR(150) ) XmlDoc列包含如下XML数据: <Documents> <Doc> <DocId>1111

我在SQLServer中有一个带有xml列的表,我的目标是将整个xml数据提取为表

假设我的桌子是这样的:

CREATE TABLE Archive
(
    [Id] INT IDENTITY,
    [Timestamp] DATETIME,
    [XmlDoc] XML,
    [Description] NVARCHAR(150)
)
XmlDoc
列包含如下XML数据:

<Documents>
  <Doc>
    <DocId>11111</DocId>
    <Status>1</Status>
    <DocType>DriverLicense</DocType>
    <ValidDate>2022-12-31</ValidDate>
  </Doc>
  <Doc>
    <DocId>22222</DocId>
    <Status>1</Status>
    <DocType>DriverLicense</DocType>
    <ValidDate>2022-07-16</ValidDate>
  </Doc>
  <Doc>
    <DocId>33333</DocId>
    <Status>2</Status>
    <DocType>DriverLicense</DocType>
    <ValidDate>2018-11-02</ValidDate>
  </Doc>
</Documents>
但它只返回每个xml的第一个
节点


可以将每个文档节点作为单独的行吗?

由于没有人回答我的问题,我自己找到了解决方案。你所需要的就是交叉申请

SELECT 
    a.b.value('(DocId)[1]', 'int') as 'id', 
    a.b.value('(Status)[1]', 'int') as 'Status',
    a.b.value('(DocType)[1]', 'varchar(20)') as 'DocType',
    a.b.value('(ValidDate)[1]', 'varchar(20)') as 'ValidDate' 
FROM 
    dbo.Archive r
    CROSS APPLY r.XmlDoc.nodes('/Documents/Doc') a(b)

也许这会对某人有所帮助。

堆栈溢出通常在周日早上很安静,但在找到答案方面做得很好。;)不过,我建议在
值中使用
text()
,因为这样会更快,因为引擎的工作量更小,而且
ValidDate
应该作为
日期类型返回。因此,
a.b.value('(ValidDate/text())[1],'date')
SELECT 
    a.b.value('(DocId)[1]', 'int') as 'id', 
    a.b.value('(Status)[1]', 'int') as 'Status',
    a.b.value('(DocType)[1]', 'varchar(20)') as 'DocType',
    a.b.value('(ValidDate)[1]', 'varchar(20)') as 'ValidDate' 
FROM 
    dbo.Archive r
    CROSS APPLY r.XmlDoc.nodes('/Documents/Doc') a(b)