2015-06-09 3 views
3

Код ниже неверен на многих уровнях, я не могу их перечислить. Я предполагаю, что любой, кто пытается ответить на этот вопрос, будет использовать таблицу тестовых данных. Ха!Лучший способ генерации XML с использованием TSQL

Я собрал несколько сообщений, подпрыгивая между EXPLICIT, RAW и PATH, и это немного улучшилось.

Я думаю, что кто-то, кто использует SQL для генерации XML, часто будет знать это с головы.

У меня нет предпочтения Ex, Raw или Path - мне нужен только лучший инструмент для работы. В конце дня будет 65 столбцов, составляющих различные уровни окончательного документа.

Мне нужен код для запроса этой таблицы и генерировать это:

<batchContactList> 
    <contact contactID="123" action="AddOrModify"> 
     <contactField name="FirstName">Johnny</contactField> 
     <contactField name="LastName">Testguy</contactField> 
     <contactPointList> 
      <contactPoint type="Email"> 
      <contactPointField name="Label">Email</contactPointField> 
      <contactPointField name="Address">[email protected]</contactPointField> 
       </contactPoint> 
      </contactPointList> 
    </contact> 
</batchContactList> 

Код проверки

--test данных

DECLARE @tvTest TABLE (contactID INT, FirstName VARCHAR(25), LastName VARCHAR(25), [type] VARCHAR(25), [address] VARCHAR(25)) 
INSERT INTO @tvTest (contactID, FirstName, LastName, [type], [address]) 
SELECT 123, 'Johnny', 'Testguy', 'email', '[email protected]' 
UNION 
SELECT 321, 'Sally', 'Testgirl', 'email', '[email protected]'; 

--Outer 
SELECT 
     A.contactID AS "@contactID" 
    , 'AddOrModify' AS "@action" 
FROM 
    @tvTest A 
FOR XML PATH('contact'), ROOT('batchContactList') 

--Level 1 
DECLARE @xmldata XML; 
SELECT @xmldata = (SELECT contactID, FirstName, LastName FROM @tvTest FOR XML PATH ('')); 

SELECT 
     ColumnName AS "@name" 
    , ColumnValue AS "text()" 
FROM 
    (SELECT 
      i.value('local-name(.)','varchar(100)') ColumnName 
     , i.value('.','varchar(100)') ColumnValue 
    FROM 
     @xmldata.nodes('//*[text()]') x(i)) tmp 
FOR XML PATH ('contactField'), ROOT('contact') 

SELECT @xmldata = (SELECT contactID, [type], [address] FROM @tvTest FOR XML PATH ('')); 

--Level 2, not complete 
SELECT 
     ColumnName AS "@name" 
    , ColumnValue AS "text()" 
FROM 
    (SELECT 
      i.value('local-name(.)','varchar(100)') ColumnName 
     , i.value('.','varchar(100)') ColumnValue 
    FROM 
     @xmldata.nodes('//*[text()]') x(i)) tmp 
FOR XML PATH ('contactPoint'), ROOT('contactPointList') 

ответ

6

Я использую PATH, всегда.

Что-то вроде этого должно дать вам то, что вы хотите.

select T.contactID as [@contactID], 
     'AddOrModify' as [@Action], 
     'FirstName' as [contactField/@name], 
     T.FirstName as [contactField], 
     null, 
     'LastName' as [contactField/@name], 
     T.LastName as [contactField], 
     (
     select 'Email' as [contactPoint/@type], 
       'Label' as [contactPointField/@name], 
       T.type as [contactPointField], 
       null, 
       'Address' as [contactPointField/@name], 
       T.address as [contactPointField] 
     for xml path('contactPointList'), type 
     ) 
from @tvTest as T 
for xml path('contact'), root('catchContactList') 

Результат:

<catchContactList> 
    <contact contactID="123" Action="AddOrModify"> 
    <contactField name="FirstName">Johnny</contactField> 
    <contactField name="LastName">Testguy</contactField> 
    <contactPointList> 
     <contactPoint type="Email" /> 
     <contactPointField name="Label">email</contactPointField> 
     <contactPointField name="Address">[email protected]</contactPointField> 
    </contactPointList> 
    </contact> 
    <contact contactID="321" Action="AddOrModify"> 
    <contactField name="FirstName">Sally</contactField> 
    <contactField name="LastName">Testgirl</contactField> 
    <contactPointList> 
     <contactPoint type="Email" /> 
     <contactPointField name="Label">email</contactPointField> 
     <contactPointField name="Address">[email protected]</contactPointField> 
    </contactPointList> 
    </contact> 
</catchContactList> 
+2

Ну, это не становится лучше, чем люди, ответили, когда я получил чашку кофе. Спасибо. Я крутил колеса. – MMDG