使用命名空间查询函数中的XML数据

时间:2014-09-05 10:07:28

标签: xml xpath namespaces sql-server-2012 xquery

从XML中检索数据时遇到问题。

with xmlnamespaces ('x-elements' as x)
select 
tb.[Profile].value('(x:ppr/x:static/refId)[1]', 'varchar(22)') testCol
from table1 tb

以上代码完美无缺。但是,当我在函数中传递XML路径时,它会正确编译,但不会在调用时返回数据,而只是xml路径(传递给它)。

CREATE FUNCTION testFunc
(
    @p varchar(22)
)
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @Rs nvarchar(max);
    with xmlnamespaces ('x-elements' as x)
    select 
        @Rs = tb.[Profile].value('(sql:variable("@p_path"))[1]', 'nvarchar(max)') 
    from table1 tb
    RETURN (@Rs)

END

我得到的结果是“x:ppr / x:sta”(这是一个不是值的路径),而它应该返回一个像“aJxk9pGntc5V”这样的值 请提出解决方案!

1 个答案:

答案 0 :(得分:1)

value()函数的参数必须是字符串文字。您不能将其替换为包含要执行的XQuery的变量/参数。

来自value() Method (xml Data Type)

<强>语法

  

value(XQuery,SQLType)

<强>的XQuery

  

XQuery表达式是一个字符串文字,用于检索数据   在XML实例中。

您尝试使用sql:variable("@p_path")会将@p_path的值作为字符串插入XQuery。它不会取代整个XQuery表达式。它会转换为类似value('("x:ppr/x:sta")', 'varchar(100)')

的内容