我的命名空间链接会根据其他数据而变化。它看起来与此类似。
@xml = myXML
@id = myID
@xml.nodes('declare namespace myS="myLink.com/@id";/myS:foo')
由于此错误,命名空间不允许链接内的变量
“'declare namespace'附近的语法错误',期望的字符串文字。”
无论如何都要动态更改名称空间网址而不对任何值进行硬编码。
答案 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真的很喜欢它。如果可能,请更改输入,以便明确定义名称空间集。