Для пути XML: Как сохранить атрибут и значение в одном узле - PullRequest
0 голосов
/ 12 мая 2018

У меня возникли проблемы при использовании FOR XML PATH.Моя ситуация такова:

Я запустил скрипт, как показано ниже, атрибут CCY и значение AMOUNT объединены в один и тот же узел:

Скрипт 1:

SELECT 'USD' AS 'Amount/@Ccy',
       123000 AS Amount,
       'Foo' AS Foo
FOR XML PATH('root'), TYPE;

Результат 1: только 1 AMOUNT узел в root узел

<root>
  <Amount Ccy="USD">123000</Amount>
  <Foo>Foo</Foo>
</root>

Сценарий 2: я меняю порядок Foo на серединуи результат неправильный

SELECT 'USD' AS 'Amount/@Ccy',
       'Foo' AS Foo,
       123000 AS Amount
FOR XML PATH('root'), TYPE;

Результат 2: в корневом узле 2 узла AMOUNT

<root>
  <Amount Ccy="USD" />
  <Foo>Foo</Foo>
  <Amount>123000</Amount>
</root>

Поэтому мой вопрос: как их сохранитьв том же узле, не соединяя их.Спасибо

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Это у него должно работать ...

Двигатель движется по списку столбцов, открывает элемент, заполняет вложенные элементы, находит новый элемент (О! Я должен закрытьпоследний!) ... и т. д.

Атрибут должен быть указан перед содержащим элементом .Порядок имеет значение!

Попробуйте:

- идентичное имя: Вы можете быть удивлены

SELECT 1 AS [SomeElement]
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

- Другое имя между

SELECT 1 AS [SomeElement]
      ,'in between' AS [SomeOther]
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

- другого элемента - ну, - нет (вы также можете использовать NULL)

SELECT 1 AS [SomeElement]
      ,''
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

- Как вы думаете, что здесь выйдет?

SELECT 'blah' AS [SomeElement/@TheAttribute]
      ,1 AS [SomeElement]
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

- ... а здесь?

SELECT 'blah' AS [SomeElement/@TheAttribute]
      ,1 AS [SomeElement]
      ,''
      ,'blub' AS [SomeElement/@TheAttribute]
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

- Это - наконец - ваш пример (в принципе)

SELECT 1 AS [SomeElement]
      ,'in between' AS [SomeOther]
      ,'blub' AS [SomeElement/@TheAttribute]
FOR XML PATH('SomeTag'),ROOT('root');

- И - просто для удовольствия!- попробуйте тоже

SELECT 1 AS [SomeElement]
      ,NULL
      ,'blub' AS [SomeElement/@TheAttribute]
FOR XML PATH('SomeTag'),ROOT('root');
0 голосов
/ 13 мая 2018

Используйте следующее, Выберите последовательность имеет значение.

SELECT 'USD' AS 'Amount/@Ccy',123000 AS Amount,
   'Foo' AS Foo FOR XML PATH('root'), TYPE;

См. Рабочий пример

...