Предложение SQL Server FORXML

#sql-server

#sql-сервер

Вопрос:

У меня есть следующий запрос в sql server

 select a.*,b.first_loss_calc_result as "@firstLoss"
    from tablea a
    inner join tableb fl on b.id = a.ID
    FOR XML AUTO, ROOT('Response')
  

Ответ, который я получаю обратно, имеет следующий формат .

  <Response>
      <a  column1="test" column 2="testh"                  ">
        <b firstLoss="1.890600000000000e 001" />
      </a>
    </Response>
  

Но я искал формат ответа, упомянутый ниже :

  <Response>
    <a  column1="test" column 2="testh"     firstLoss= "1.890600000000000e 001"></a>         
  </Response>
  

В принципе, я хочу, чтобы весь столбец из таблицы a и один столбец из таблицы B были атрибутом элемента

Может кто-нибудь сообщить мне, как я могу это сделать. Спасибо за помощь!

Ответ №1:

Тестовые данные

 DECLARE @TABLE1 TABLE (ID INT, column1 VARCHAR(100), Column2 VARCHAR(100))
INSERT INTO @TABLE1 VALUES 
(1, 'Col1 Value1', 'Col2 Value1'),
(2, 'Col1 Value2', 'Col2 Value2')


DECLARE @TABLE2 TABLE (ID INT, FirstLoss INT)
INSERT INTO @TABLE2 VALUES 
(1, 1000),(2,2000)
  

Запрос

 select A.column1   AS [@Column1]
      ,A.Column2   AS [@Column2]
      ,B.FirstLoss AS [@firstLoss]
from @TABLE1 a
inner join @TABLE2 B on b.id = a.ID
FOR XML PATH('a'), ROOT('Response')
  

Результат

 <Response>
  <a Column1="Col1 Value1" Column2="Col2 Value1" firstLoss="1000" />
  <a Column1="Col1 Value2" Column2="Col2 Value2" firstLoss="2000" />
</Response>
  

Комментарии:

1. есть ли способ получить a.* в первой таблице в этом запросе, поскольку столбцы в таблице a составляют около 10-20 и продолжают меняться

2. Я подумал, что это AS [@Name] было странным, но оказалось, что это необходимо (или, по крайней мере, имеет эффект) sqlfiddle.com /#!6/d41d8/20004 против sqlfiddle.com /#!6/d41d8/20005

3. Если вы хотите, чтобы значения из столбцов отображались как значения атрибутов в XML, вам нужно будет использовать имена столбцов вместе с псевдонимом, начинающимся с @ это по синтаксису, обойти это невозможно.