簡體   English   中英

在 SQL Server XML 查詢中從 nodes() 返回什么類型

[英]What type is returned from nodes() in a SQL Server XML query

如果我有一個 XML 類型的 SQL 變量,則可以將它直接用作 SELECT 子句的列(即使該值是一個沒有單個根元素的 XML 片段)

DECLARE @Items XML
SET @Items = '<item>one</item><item>two</item>'
SELECT @Items

然而,當我使用nodes()函數以任何方式切碎該 XML 變量時,SQL Server 抱怨說

SELECT Items.Item FROM @Items.nodes('/') AS Items (Item)
-- The column 'Item' that was returned from the nodes() method cannot be used directly. It can only be used with one of the four XML data type methods, exist(), nodes(), query(), and value(), or in IS NULL and IS NOT NULL checks.

當我按照錯誤消息中包含的提示進行操作時就好了

SELECT Items.Item.query('.') FROM @Items.nodes('/') AS Items (Item)
SELECT Items.Item.query('.') FROM @Items.nodes('//item') AS Items (Item)

但是,如果不使用其中一種“XML 數據類型”方法,我什至無法將結果轉換回 XML。

SELECT CAST(Items.Item AS XML) FROM @Items.nodes('/') AS Items (Item)
-- The column that was returned from the nodes() method cannot be converted to the data type xml. It can only be used with one of the four XML data type methods, exist(), nodes(), query(), and value(), or in IS NULL and IS NOT NULL checks.

Items.Item列的數據類型是什么,為什么我不能在不涉及其他方法的情況下將其用作 XML(當顯然可以直接選擇 XML 數據類型的列時?)

讓我們看一個稍微不同的例子。

DECLARE @Items XML
SET @Items = '<data><item>one</item><item>two</item></data>'

SELECT Items.Item.query('.') 
FROM @Items.nodes('data/item') AS Items (Item)

這將返回以下結果

Items.Item.query('.')
<item>一個</item>
<item>兩個</item>

我在下面添加了一個額外的列,以指示Items.Item概念上返回的每一行的結果。

Items.Item.query('.') Items.Item
<item>一個</item> 在此處輸入圖片說明
<item>兩個</item> 在此處輸入圖片說明

這是nodes方法的輸入文檔相同的文檔 只是上下文節點(由箭頭指示)在每一行中設置不同。

您可以通過使用..表達式來選擇上下文節點的父節點來查看這一點

SELECT Items.Item.query('..') AS [Items.Item.query('..')]
FROM @Items.nodes('data/item') AS Items (Item) 

退貨

+-----------------------------------------------+
|            Items.Item.query('..')             |
+-----------------------------------------------+
| <data><item>one</item><item>two</item></data> |
| <data><item>one</item><item>two</item></data> |
+-----------------------------------------------+

如果可以直接選擇Items.Item ,我懷疑這是否是用戶的期望,即它只會返回輸入文檔。 如果你只想返回輸入文檔,你可以直接選擇這個

SELECT Items.Item.query('.') AS [Items.Item.query('.')], @Items
FROM @Items.nodes('data/item') AS Items (Item)

官方文檔說它是一個rowset 這是它的摘錄:

nodes() 方法的結果是一個行集,其中包含原始 XML 實例的邏輯副本。 在這些邏輯副本中,每個行實例的上下文節點都設置為用查詢表達式標識的節點之一。 這樣,以后的查詢可以相對於這些上下文節點進行導航。

nodes() 方法(xml 數據類型)

暫無
暫無

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

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