Используйте xQuery для извлечения значений атрибутов, которые также существуют в переменной SQL - PullRequest
1 голос
/ 06 июля 2019

Структура XML:

<ns0:message xmlns:ns0='xxx:testing'>
  <ns0:field name='AAA'>...</ns0:field>
  <ns0:field name='BBB'>...</ns0:field>
  <ns0:field name='VVV'>...</ns0:field>
  <ns0:field name='CAR'>...</ns0:field>
</ns0:message>

У меня есть SQL, который будет извлекать значения атрибутов с названием name:

SELECT
  ( (SELECT ',' + CHAR(13) + P.N.value('@name', 'varchar(max)')
       FROM myTable.message_xml.nodes('declare namespace ns0="xxx:testing";
                                       ns0:message/ns0:field[ @name = "AAA" or
                                                              @name = "BBB"]') P(N)
        FOR XML PATH(''), type).value('substring(text()[1], 3)', 'varchar(max)')) as ATTRIBUTE_VALUES

Возвращает столбец, который выглядит следующим образом:

ATTRIBUTE_VALUES
---------------
AAA,
BBB

Моя проблема в том, что список потенциальных значений атрибутов довольно велик.
Вместо того, чтобы повторять @name = "AAA" в моем запросе для каждого значения атрибута, которое я хочу проверить, я надеялся, что смогу объявить его как переменную типа:

DECLARE @ATTRIBUTES VarChar(Max)
SET @ATTRIBUTES = '(AAA,BBB,CAR,XYZ)'

А затем просто вставьте переменную в sql как:

[@name = sql:variable("@ATTRIBUTES")]

но это не работает для любой комбинации паренов, запятых и т. Д., Которые я использую для создания переменной.

1 Ответ

2 голосов
/ 08 июля 2019

Вы можете использовать функцию contains. Объявите переменную так:

DECLARE @ATTRIBUTES VarChar(Max) = '|AAA|BBB|CAR|XYZ|';

А в вашем запросе вместо @name = "AAA" используйте:

contains(sql:variable("@ATTRIBUTES"), concat("|", @name, "|"))
...