首页 > 解决方案 > XML 数据类型方法“值”返回 XQuery 而不是值

问题描述

简化示例:

DECLARE @xml AS XML
SET @xml='
 <utmVisit>
    <utmSource>cpa1</utmSource>
 </utmVisit>'  

DECLARE @utmType NVARCHAR(255) = 'utmSource[1]'

SELECT c.value('utmSource[1]', 'nvarchar(255)')
    FROM @xml.nodes('//utmVisit') T(c) 
    
SELECT c.value('sql:variable("@utmType")', 'nvarchar(255)')
    FROM @xml.nodes('//utmVisit') T(c) 

第一个选择给我们“cpa1”,这是我们想要的值。

第二个给出“utmSource [1]”,这是@utmType 本身的值。

所以我希望得到“cpa1”但得到“utmSource [1]”。

我不能动态构建 XQuery 吗?

标签: sql-serverxmlxquery

解决方案


如 Microsoft 官方文档中所述:

value (XQuery, SQLType)

论据

XQuery 是 XQuery 表达式,一个字符串文字,用于检索 XML 实例内的数据。XQuery 最多只能返回一个值。否则,返回错误。

所以它期待一个文字字符串。

尽管您可以使用可能是动态的 XPath 谓词表达式。例如,使用 T-SQL 变量等。

SQL

DECLARE @xml AS XML =
'<utmVisit>
    <utmSource>cpa1</utmSource>
 </utmVisit>';  

DECLARE @utmType NVARCHAR(255) = 'utmSource';

SELECT c.value('(utmSource/text())[1]', 'nvarchar(255)')
    FROM @xml.nodes('//utmVisit') T(c); 
    
SELECT c.value('(*[local-name(.) = sql:variable("@utmType")]/text())[1]', 'nvarchar(255)')
    FROM @xml.nodes('//utmVisit') T(c); 

推荐阅读