sql: переменная для определения xpath в узлах MS-SQL

Я просмотрел несколько примеров и комментариев из разных блогов, и хотя я видел много примеров использования sql:variable для выбора определенных узлов/атрибутов, я не уверен, что что-то настолько простое, как выбор узла, можно заменить переменной SQL. . Например, если у меня есть следующее:

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

и позже я мог бы использовать перекрестное применение что-то вроде:

cross apply MyXml.nodes(@NodeStartPoint)

очевидно, что приведенный выше выбор узлов перекрестного применения не работает. Я также пробовал:

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

и, возможно, еще несколько странных комбинаций!

Идея в том, что я могу передать выбор узла из параметра и т.д.

Я начал просматривать http://blogs.msdn.com/b/mrys/ и также http://msdn.microsoft.com/en-us/library/ms186960%28SQL.90%29.aspx, но пока я не могу найти ни одного примера того, чего я пытаюсь достичь, что заставляет меня думать, что я лаю не по тому дереву! :)

Любые идеи с благодарностью принимаются !!


person Dav.id    schedule 08.03.2013    source источник


Ответы (1)


Хорошо, вроде отвечая на мой собственный вопрос, учитывая тип ответов, которые я видел на подобный вопрос в Интернете.. этот очень похож: Передача аргумента в метод узлов T-SQL (XML CROSS APPLY)

Итак, я предполагаю, что это невозможно сделать с помощью замены переменной в выражении nodes().

person Dav.id    schedule 08.03.2013
comment
Нет, sql_variable нельзя использовать для замены выражения xQuery. Выражение должно быть строковым литералом, и оно используется, когда SQL Server строит план запроса, поэтому нет возможности разрешить изменение выражения во время выполнения. Использование динамического SQL в качестве опции. - person Mikael Eriksson; 08.03.2013
comment
Еще раз спасибо @Mikael !! после просмотра множества статей это, безусловно, выглядит так. Я могу понять, что должен делать механизм SQL, поэтому сейчас я либо попробую динамический подход SQL, либо не буду использовать параметры для выражения (так как они будут все равно сильно не изменишься). Я отмечу этот ответ как правильный, чтобы он отображался при поиске других, однако вы действительно должны получить кредит :) - person Dav.id; 08.03.2013
comment
Если у вас есть известная глубина узлов, вы можете использовать local-name() для проверки sql:variable. Если, например, у вас есть трехуровневое выражение xpath /a/b/c, вы можете сделать это без динамического SQL, если вы использовали три параметра и проверяли каждый уровень с помощью local-name() = sql:variable("Param1") и т. д. - person Mikael Eriksson; 08.03.2013
comment
Вы можете использовать что-то вроде этого в качестве отправной точки: SQL Fiddle. Просто измените выражение, чтобы использовать проверки там, где вам нужны альтернативные пути. - person Mikael Eriksson; 08.03.2013
comment
Привет, спасибо @MikaelEriksson !! Мне действительно удалось (с вашими примерами) заставить его работать ... и это здорово ... большое спасибо за это! - person Dav.id; 14.03.2013