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但到目前为止,我无法找到的东西,我想任一实例实现,这让我觉得我在吠叫错误的树! :)
任何想法感激地收到!
不能,'sql_variable'不能用于替换xQuery表达式。该表达式必须是字符串文字,并在SQL Server构建查询计划时使用,因此无法对表达式进行“运行时”更改。使用[动态SQL选项](http://stackoverflow.com/a/14812275/569436)。 – 2013-03-08 12:54:07
再次感谢@Mikael!在浏览大量文章之后,它肯定看起来就像那样..我可以理解SQL引擎必须做什么,所以现在我要么尝试动态sql方法,要么不使用表达式的参数(因为它们会反正不会改变那么多)。我将标记这个答案是正确的,只是为了显示如果其他搜索,但是你真的应该得到信用:) – 2013-03-08 14:02:47
如果你有一个深度已知的节点,你可以使用'local-name()'来检查'sql:variable' 。例如,如果您有三个级别的xpath表达式'/ a/b/c',那么如果您使用三个参数并使用'local-name()= sql:variable(“Param1”)检查每个级别,则可以不使用动态SQL '等 – 2013-03-08 17:11:10