【问题标题】:Do I need /text() when selecting an attribute value from an XML column?从 XML 列中选择属性值时是否需要 /text()?
【发布时间】:2015-06-27 16:47:12
【问题描述】:

我见过examples 这样做,/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 万行(PK 限制为 10 行),以及实际的执行计划 不同,但我不是阅读执行计划的专家。它还一直声称有/text() 的版本占总数的54%,没有的版本是46%。这表明存在某种差异。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    存在差异,但显然您在数据中没有遇到它。这是一个例子:

    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];
    

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多