【发布时间】:2019-10-15 12:25:08
【问题描述】:
重新评估此处给出的示例: SQL Variable in XML Node
给定:
DECLARE @x TABLE(item XML)
DECLARE @schemaname VARCHAR(100)
SET @schemaname = 'Bla'
INSERT into @x
SELECT '
<GaleriesSchem2>
<Hello>
<Bla>
<Image_1 OriginalName="Image">12.jpg</Image_1>
<Image_2 OriginalName="Image2">45.jpg</Image_2>
</Bla>
</Hello>
</GaleriesSchem2>
<GaleriesSchem3>
<Image_1 OriginalName="Image">67.jpg</Image_1>
<Image_2 OriginalName="Image2">89.jpg</Image_2>
</GaleriesSchem3>
'
SELECT rref.value('.', 'varchar(MAX)') AS 'Value'
FROM @x
CROSS APPLY
item.nodes('GaleriesSchem2/Hello/*[local-name()=sql:variable("@schemaname")]/node()') AS Results(rref)
当变量 @schemaname 仅为 'Bla' 时,Select 语句返回 12.jpg 和 45.jpg,但当变量 @schemaname 为 'GaleriesSchem2/Hello/Bla' 时,它什么也不返回。使用时
SET @schemaname = 'GaleriesSchem2/Hello/Bla'
SELECT rref.value('.', 'varchar(MAX)') AS 'Value'
FROM @x
CROSS APPLY
item.nodes('*[local-name()=sql:variable("@schemaname")]/node()') AS Results(rref)
这里的冲突在哪里?如何使用变量访问 xml 节点?在这种情况下,变量是 @schemaname = 'GaleriesSchem2/Hello/Bla'。
更新 为了在这种情况下完成工作,我尝试了两个建议的动态 sql 可能是解决问题的一种方法。为此,我将@x 变量设置为一个真实的表,并将 XML 片段放入其中。
DECLARE @schemaname VARCHAR(100)
Declare @sql nvarchar(500)
Create Table x(item XML)
INSERT into x
SELECT '
<GaleriesSchem2>
<Hello>
<Bla>
<Image_1 OriginalName="Image">12.jpg</Image_1>
<Image_2 OriginalName="Image2">45.jpg</Image_2>
</Bla>
</Hello>
</GaleriesSchem2>
<GaleriesSchem3>
<Image_1 OriginalName="Image">67.jpg</Image_1>
<Image_2 OriginalName="Image2">89.jpg</Image_2>
</GaleriesSchem3>
'
SET @schemaname = 'GaleriesSchem2/Hello/Bla/node()'
Set @sql = N'SELECT rref.value(' + '''.''' + ', ' + '''varchar(MAX)''' + ') AS Value FROM x CROSS APPLY item.nodes(''' + @schemaname + ''') AS Results(rref)';
Exec sp_executesql @sql
【问题讨论】:
-
您不能以这种方式动态评估路径。 XQuery 不允许变量路径名,并且 T-SQL 不允许 XQuery 变量。您可以通过动态构建整个查询来解决此问题,但这不是野餐。您将不得不重新考虑您的方法(具体如何取决于您通过这些动态路径尝试实现的目标)。
-
@JeroenMostert 感谢您的评论。至少知道什么不能做是很高兴的,所以你不需要在这个方向上付出更多的努力。
标签: sql-server xml