2013-03-08 60 views
1

我已经扫描了来自不同博客的几个示例和注释,虽然我看到很多使用sql:variable选择某些节点/属性的示例,但我不确定像节点选择一样简单,可以用SQL变量替换。举例来说,如果我有以下几点:sql:在MS-SQL节点中定义xpath的变量

declare @NodeStartPoint varchar(255) = '/root/parent/child' 

后来,我可能会使用交叉应用是这样的:

cross apply MyXml.nodes(@NodeStartPoint) 

显然上述交叉应用节点选择不工作。我也尝试过:

cross apply MyXml.nodes('sql:variable(@NodeStartPoint)') 

并可能还有其他一些奇怪的组合!

的想法是,这样我可以从一个PARAM等节点选择通过..

我已经开始期待通过http://blogs.msdn.com/b/mrys/http://msdn.microsoft.com/en-us/library/ms186960%28SQL.90%29.aspx但到目前为止,我无法找到的东西,我想任一实例实现,这让我觉得我在吠叫错误的树! :)

任何想法感激地收到!

回答

2

好吧,排序回答我的问题给我也看到类似的问题在互联网的响应类型的..这是一个非常相似:Passing an argument to the T-SQL Nodes method (XML CROSS APPLY)

所以,我猜测它不能做在nodes()语句中使用变量替换。

+1

不能,'sql_variable'不能用于替换xQuery表达式。该表达式必须是字符串文字,并在SQL Server构建查询计划时使用,因此无法对表达式进行“运行时”更改。使用[动态SQL选项](http://stackoverflow.com/a/14812275/569436)。 – 2013-03-08 12:54:07

+0

再次感谢@Mikael!在浏览大量文章之后,它肯定看起来就像那样..我可以理解SQL引擎必须做什么,所以现在我要么尝试动态sql方法,要么不使用表达式的参数(因为它们会反正不会改变那么多)。我将标记这个答案是正确的,只是为了显示如果其他搜索,但是你真的应该得到信用:) – 2013-03-08 14:02:47

+1

如果你有一个深度已知的节点,你可以使用'local-name()'来检查'sql:variable' 。例如,如果您有三个级别的xpath表达式'/ a/b/c',那么如果您使用三个参数并使用'local-name()= sql:variable(“Param1”)检查每个级别,则可以不使用动态SQL '等 – 2013-03-08 17:11:10