Код ниже неверен на многих уровнях, я не могу их перечислить. Я предполагаю, что любой, кто пытается ответить на этот вопрос, будет использовать таблицу тестовых данных. Ха!Лучший способ генерации 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')
Ну, это не становится лучше, чем люди, ответили, когда я получил чашку кофе. Спасибо. Я крутил колеса. – MMDG