SQL 服务器内带有 XQuery 的动态命名空间

Dynamic Namespace with XQuery inside SQL Server

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

@xml = myXML
@id = myID

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

由于这个错误

,命名空间不允许 link 内的变量

"Syntax error near 'declare namespace', expected string literal."

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

因为 .nodes() 需要一个字符串文字并且命名空间必须是字符串文字,所以除了使用动态 SQL 构造整个语句之外,没有办法使命名空间动态化。但是,您可以 select 节点而无需引用显式名称空间声明。这将 select 任何名为 "foo" 的元素,无论命名空间如何:

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

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

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

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