2015-06-27 78 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!我应该想到这一点,谢谢。 :-) –