[英]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.