2015-06-27 49 views
3

我見過examples做這樣的,有/text()從XML列中選擇屬性值時,是否需要/ text()?

SELECT someColumn.value('(/someElement[@someAttribute="some value"]/text())[1]', 'nvarchar(100)') 
FROM SomeTable 

,我已經看到了一些(包括MSDN)離開關/text()步:

SELECT someColumn.value('(/someElement[@someAttribute="some value"])[1]', 'nvarchar(100)') 
-- No /text() here ------------------------------------------------^ 
FROM SomeTable 

這兩種形式都與我的工作數據。從風格以外的角度來看它有什麼重要嗎?如性能或假設,...

更新:我已經在「實際執行計劃」打開同一批次運行兩個查詢,使用一個簡單的合成示例約100萬行(限制爲10行由PK)和實際執行計劃不同,但我並不是專家在閱讀執行計劃。它也一致聲稱/text()的版本是54%,而沒有版本的版本是46%。這表明有某種差異。

回答

2

有一個區別,但顯然你沒有在你的數據中遇到它。這裏是一個例子:

declare @x xml; 

set @x = ' 
<Item Id="1">Just a text</Item> 
<Item Id="2"> 
    <SubItem Id="247">Subitem text.</SubItem> 
Text and some extra</Item> 
'; 

select @x.value('/Item[@Id="1"][1]', 'varchar(max)') as [No text works], 
    @x.value('/Item[@Id="2"][1]', 'varchar(max)') as [More complex case], 
    @x.value('(/Item[@Id="2"]/text())[1]', 'varchar(max)') as [Text fixes it]; 
+0

Doh!我應該想到這一點,謝謝。 :-) –