Динамическое пространство имен с XQuery внутри SQL Server

У меня есть ссылка на мое пространство имен, которое меняется в зависимости от других данных. Это похоже на это.

@xml = myXML
@id = myID

@xml.nodes('declare namespace myS="myLink.com/@id";/myS:foo')

Поскольку пространство имен не позволяет использовать переменные внутри ссылки из-за этой ошибки

«Синтаксическая ошибка рядом с «объявлением пространства имен», ожидаемый строковый литерал».

Есть ли способ динамически изменить URL-адрес пространства имен без жесткого кодирования каких-либо значений.


person user3070528    schedule 06.02.2015    source источник


Ответы (1)


Поскольку .nodes() ожидает строковый литерал, а пространства имен должны быть строковыми литералами, нет никакого способа сделать пространство имен динамическим, кроме построения всего оператора с использованием динамического SQL. Однако вы можете выбирать узлы, не обращаясь к явному объявлению пространства имен. Это выберет любой элемент с именем «foo» независимо от пространства имен:

@xml.nodes('/*[local-name()="foo"]')

Если вам действительно нужно выбрать элемент с определенным динамическим пространством имен, вы можете использовать namespace-uri():

DECLARE @myNS NVARCHAR(MAX) = REPLACE('myLink.com/$id', '$id', @id);
@xml.nodes('/*[local-name()="foo" and namespace-uri()=sql:variable("@myNS")]')

Помимо того, что это неуклюже, это может иметь проблемы с производительностью - XPath действительно нравится, если вы сохраняете постоянные пространства имен. Если возможно, измените ввод, чтобы набор пространств имен был четко определен.

person Jeroen Mostert    schedule 20.02.2015