TSQL XML существует запрос с пространствами имен и условием IF-ELSE - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу написать код T-SQL, который объединяет использование функции XML exists() с пространствами имен и конструкцией IF-ELSE.

Из этой цепочки Я знаю, что WITH XMLNAMESPACES используется для использования пространств имен.Я также знаю, что функция exist() используется для определения наличия узла в переменной XML.

До сих пор я использовал exist() следующим образом:

IF ((@MyXML.exist('someNode')) = 0)
BEGIN
    -- Do Something
END
ELSE
BEGIN
    -- Do Something else
END

ОднакоЯ не знаю, как это объединить, если мне нужно использовать пространства имен.Я попытался следующим образом, но получил ошибку.

;WITH XMLNAMESPACES('http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message' AS ns)
IF ((@MyXML.exist('ns:someNode')) = 0)
BEGIN
    -- Do Something
END
ELSE
BEGIN
    -- Do Something else
END

Я получил следующую ошибку:

Неверный синтаксис рядом с ключевым словом 'WITH'.

Следовательно, мой вопрос: как я могу использовать конструкцию T-SQL If-Else в сочетании с пространствами имен XML и функцией XML exist()?

1 Ответ

0 голосов
/ 26 ноября 2018

У вас уже есть одно решение от Jeroen (ссылка на документацию).Но - просто для удовольствия - я хотел бы показать вам, что есть несколько способов:

DECLARE @xml XML=
N'<root xmlns:ns="dummy">
    <ns:test>1</ns:test>
  </root>';

- подстановочный знак для пространства имен

IF @xml.exist('//*:test[text()=1]')=1
    PRINT 'test 1-yes'
ELSE
    PRINT 'test 1-no';

- встроенное объявление(как сказано в документации)

IF @xml.exist('declare namespace ns="dummy";//ns:test[text()=1]')=1
    PRINT 'test 2-yes'
ELSE
    PRINT 'test 2-no';

- вы можете использовать все вышеперечисленное для установки переменной

DECLARE @check BIT = @xml.exist('//*:test[text()=1]');

- И - при необходимости - вы все еще можете использоватьWITHXMLNAMESPACES, как здесь, чтобы установить переменную

WITH XMLNAMESPACES('dummy' AS ns)
SELECT @check=@xml.exist('//ns:test[text()=1]');

IF @check=1
    PRINT 'test 4-yes'
ELSE
    PRINT 'test 4-no';

В целом это пахнет немного процедурный ... Может быть, есть лучший подход полностью ...

...