Как сказал вам Йерун Мостерт в комментарии, это невозможно. Вы можете использовать local-name()
в сочетании с sql:variable()
для проверки определенного элемента, но вы не можете ввести XPath-переменную.
Вы можете динамически построить весь оператор и использовать EXEC()
или sp_executesql()
для выполнения, или вы можете использовать рекурсивный CTE, чтобы пройти по XML и вернуть каждый элемент с его путем.
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>';
WITH recCTE AS
(
SELECT CONCAT('/',CAST(TopLevelNode.value('local-name(.)','nvarchar(max)') AS NVARCHAR(MAX)),'/') AS NodePath
,TopLevelNode.query('./*') AS SubNodes
,TopLevelNode.value('text()[1]','nvarchar(max)') AS Content
FROM @x
CROSS APPLY item.nodes('*') A(TopLevelNode)
UNION ALL
SELECT CONCAT(r.NodePath,CAST(TheNextLevel.value('local-name(.)','nvarchar(max)') AS NVARCHAR(MAX)),'/')
,TheNextLevel.query('./*')
,TheNextLevel.value('text()[1]','nvarchar(max)') AS Content
FROM recCTE r
OUTER APPLY r.SubNodes.nodes('*') A(TheNextLevel)
WHERE r.SubNodes.exist('*')=1
)
SELECT *
FROM recCTE
WHERE Content IS NOT NULL;
Результат
NodePath Content
/GaleriesSchem3/Image_1/ 67.jpg
/GaleriesSchem3/Image_2/ 89.jpg
/GaleriesSchem2/Hello/Bla/Image_1/ 12.jpg
/GaleriesSchem2/Hello/Bla/Image_2/ 45.jpg
Против этого набора вы можете использоватьВаш XPath в простом LIKE
...
Но - если честно - это очень ограниченно и довольно медленно ...