簡體   English   中英

如何在 SQL Server 中選擇 XML 列的頂級屬性?

[英]How do I select a top-level attribute of an XML column in SQL Server?

我在 SQL Server 中有一個 XML 列,它相當於:

<Test foo="bar">
  <Otherstuff baz="belch" />
</Test>

我想將 Test(根元素)的foo屬性的值作為 varchar 獲取。 我的目標是:

SELECT CAST('<Test foo="bar"><Otherstuff baz="belch" /></Test>' AS xml).value('@foo', 'varchar(20)') AS Foo

但是當我運行上述查詢時,我收到以下錯誤:

消息 2390,級別 16,狀態 1,行 1 XQuery [value()]:不支持頂級屬性節點

約翰桑德斯幾乎是對的:-)

declare @Data XML
set @Data = '<Test foo="bar"><Otherstuff baz="belch" /></Test>'

select @Data.value('(/Test/@foo)[1]','varchar(20)') as Foo

這對我有用(SQL Server 2005 和 2008)

馬克

如果您不知道根元素:

select @Data.value('(/*/@foo)[1]','varchar(20)') as Foo

為什么.value('@foo', 'varchar(20)')生成錯誤“不支持頂級屬性節點”?

當您查詢xml數據類型時,上下文是文檔節點,它是一個隱含節點,包含您的 XML 文檔的根元素。 文檔節點沒有名稱和屬性。

如何獲取根元素上的屬性值?

在 XQuery 表達式中,包含第一個根元素的路徑:

DECLARE @Data xml = '<Customer ID="123"><Order ID="ABC" /></Customer>'

SELECT @Data.value('Customer[1]/@ID', 'varchar(20)')
-- Result: 123

如果您不知道(或不想指定)根元素的名稱,則只需使用*來匹配任何元素:

SELECT @Data.value('*[1]/@ID', 'varchar(20)')
-- Result: 123

因為查詢上下文是文檔節點,所以您不需要在 XQuery 表達式前面加上正斜杠(因為其他答案是不必要的)。

為什么我必須包含[1]

您傳遞給value()的 XQuery 表達式必須保證返回單例。 表達式Customer/@ID不滿足此要求,因為它在以下示例中同時匹配ID="123"ID="456"

DECLARE @Data xml = '<Customer ID="123" /><Customer ID="456" />'

請記住, xml數據類型表示 XML 文檔片段,而不是 XML 文檔,因此它可以包含多個根元素。

Customer[1]/@ID(Customer/@ID)[1]有什么區別?

表達式Customer[1]/@ID檢索第一個<Customer>元素的ID屬性。

表達式(Customer/@ID)[1]檢索所有<Customer>元素的ID屬性,並從該屬性列表中選擇第一個。

以下示例演示了差異:

DECLARE @Data xml = '<Customer /><Customer ID="123" /><Customer ID="456" />'

SELECT @Data.value('Customer[1]/@ID', 'varchar(20)')
-- Result: NULL (because the first Customer element doesn't have an ID attribute)

SELECT @Data.value('(Customer/@ID)[1]', 'varchar(20)')
-- Result: 123

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM