【问题标题】:Dynamic Namespace with XQuery inside SQL ServerSQL Server 中带有 XQuery 的动态命名空间
【发布时间】:2015-02-06 19:33:56
【问题描述】:

我的命名空间有一个链接,该链接会根据其他数据而变化。它看起来与此类似。

@xml = myXML
@id = myID

@xml.nodes('declare namespace myS="myLink.com/@id";/myS:foo')

由于这个错误,命名空间不允许链接内的变量

“'declare namespace' 附近的语法错误,应为字符串文字。”

是否可以动态更改命名空间 url 而无需硬编码任何值。

【问题讨论】:

    标签: xquery-sql


    【解决方案1】:

    因为.nodes() 需要一个字符串文字,并且命名空间必须是字符串文字,所以没有办法让命名空间动态化,而不是使用动态 SQL 构造整个语句。但是,您可以选择节点而不参考显式命名空间声明。这将选择任何名为“foo”的元素,而不管命名空间如何:

    @xml.nodes('/*[local-name()="foo"]')
    

    如果确实需要选择具有特定动态命名空间的元素,可以使用namespace-uri()

    DECLARE @myNS NVARCHAR(MAX) = REPLACE('myLink.com/$id', '$id', @id);
    @xml.nodes('/*[local-name()="foo" and namespace-uri()=sql:variable("@myNS")]')
    

    除了笨拙之外,这可能还有性能问题——如果您保持命名空间不变,XPath 真的很喜欢它。如果可能,请更改您的输入,以便明确定义命名空间集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2014-03-21
      • 2023-03-09
      • 2023-03-17
      相关资源
      最近更新 更多