在SQL Server中使用XQuery的动态命名空间

时间:2015-02-06 19:33:56

标签: xquery-sql

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

@xml = myXML
@id = myID

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

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

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

无论如何都要动态更改名称空间网址而不对任何值进行硬编码。

1 个答案:

答案 0 :(得分:2)

因为.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真的很喜欢它。如果可能,请更改输入,以便明确定义名称空间集。