我在SQL Server中有一个带有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>
我需要这样的表格:
我尝试了
SELECT
XmlDoc.value('(/Documents/Doc/DocID)[1]', 'int') as [DocID],
XmlDoc.value('(/Documents/Doc/Status)[1]', 'int') as [Status],
XmlDoc.value('(/Documents/Doc/DocType)[1]', 'nvarchar(30)') as [DocType],
XmlDoc.value('(/Documents/Doc/ValidDate)[1]', 'datetime') as [ValidDate]
FROM
dbo.Archive
但是它仅返回每个xml的第一个<Doc>
节点。
是否可以将每个Doc节点作为单独的行获得?
答案 0 :(得分:4)
由于没有人回答我的问题,所以我自己找到了解决方案。您只需要交叉申请
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)
也许会帮助别人。