Sql server 如何将xml节点中的数据提取为列中的表?
我在SQLServer中有一个带有xml列的表,我的目标是将整个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
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)