xml - 在具有命名空间的函数中查询 XML 数据

标签 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”这样的值
请提出解决方案!

最佳答案

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

来自 value() Method (xml Data Type)

语法

value (XQuery, SQLType)



XQuery

Is the XQuery expression, a string literal, that retrieves data inside the XML instance.



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

关于xml - 在具有命名空间的函数中查询 XML 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25683412/

相关文章:

android - Android中加载和修改xml文件

xml - XSLT 格式化输出已完成 90%

dom - 匹配字符串并提取外部元素?

sql - 将XML节点值分成SQL中的单独行

c# - 有没有办法通过 C# 代码获取类中所有 namespace 'using'?

namespaces - 使用标识符创建 URI 的良好做法

r - 在编写使用 Matrix 包的 R 包时,为什么我必须指定 Matrix::t() 而不是 t()?

xml - 如何让 IXmlDomDocument2.XML 正确转义引号?

java - 如何使用java删除XML字符串

xml - 如何使用 ant 根据模式验证 XML 文件?