Создание XML из таблицы SQL (уникальное форматирование XML)

Итак, я пытаюсь создать файл XML из таблицы SQL. Я знаю способ использования...

Select * From dbo.[db_name]
FOR XML PATH

Но проблема в том, что стиль/форматирование XML довольно странный...

                    <ID>170607A13</ID>
                    <MaterialActual>
                        <MaterialLotID>170607A13</MaterialLotID>
                        <MaterialActualProperty>
                            <ID>CreationDate</ID>
                            <Value>
<ValueString>2017-06-07T12:26:27.667-05:00</ValueString>
                            </Value>
                        </MaterialActualProperty>

Поэтому я решил, что могу пойти по пути объединения и вставки в файл XML. Вот так...

DECLARE @NAME varchar(50)
DECLARE @LOCATION varchar(50)
DECLARE @SearchXML xml

SET @SearchXML = '<Root>
            <CallerInformation>
                <LastName>' + @LOCATION + '</LastName>
                <FirstName>' + @NAME + '</FirstName>

            </CallerInformation>
        </Root>'

SELECT @SearchXML 

Но когда я это делаю, меня возвращают...

введите здесь описание изображения

Если бы я мог указать в правильном направлении или даже привести пример, это было бы здорово!


person duckfeet23    schedule 29.06.2017    source источник
comment
Изучите функции xQuery и не выполняйте конкатенацию строк в XML. Это может быть хорошей отправной точкой для вас: dba.stackexchange.com/questions/107827/, а также docs.microsoft.com/en-us/sql/t-sql/xml/   -  person Jacob H    schedule 29.06.2017


Ответы (1)


Но проблема в том, что стиль/форматирование XML довольно странный...

Что там странного? Единственное, что я вижу странно, это попытка решить это на уровне строки...

В вашем вопросе отсутствуют образцы данных и ожидаемый результат. Простой select, который вы предоставляете, ничего нам не говорит, XML, который вы предоставляете, является неразборчивым фрагментом, а фактический пример - это нечто совершенно другое...

Просто несколько советов:

Ваш простой пример должен быть выполнен следующим образом:

DECLARE @NAME varchar(50)
DECLARE @LOCATION varchar(50)
DECLARE @SearchXML xml

SET @SearchXML = 
(
    SELECT @LOCATION AS LastName
          ,@NAME AS FirstName
    FOR XML PATH('CallerInformation'),ROOT('Root'),TYPE

);

SELECT @SearchXML;

Это приведет к почти пустому (но правильному!) XML, введите любое значение в переменные, и вы увидите заполненный XML.

ОБНОВЛЕНИЕ: Ваш странный XML...

Попробуйте что-то вроде этого:

SET @xml=
(
    SELECT '170607A13' AS ID
          ,'170607A13' AS [MaterialActual/MaterialLot]
          ,'CreationDate' AS [MaterialActual/MaterialActualProperty/ID]
          ,GETDATE() AS [MaterialActual/MaterialActualProperty/Value/ValueString]
    FOR XML PATH('')
);
SELECT @xml

ОБНОВЛЕНИЕ 2: очень длинный XPath...

Это ваша ошибка: длина имени больше 128

DECLARE @xml XML;
--SET @xml=
--(
--    SELECT '170607A13' AS ID
--          ,'170607A13' AS [MaterialActual1234567890/MaterialLot1234567890]
--          ,'CreationDate' AS [MaterialActual1234567890/SomeMore1234567890/EvenMore1234567890/StillMore1234567890/MaterialActualProperty1234567890/ID1234567890]
--          ,GETDATE() AS [MaterialActual1234567890/SomeMore1234567890/EvenMore1234567890/StillMore1234567890/MaterialActualProperty1234567890/ValueString1234567890]
--    FOR XML PATH('')
--);
--SELECT @xml

--Это решение: вложенный подвыбор:

SET @xml=
(
    SELECT '170607A13' AS ID
          ,'170607A13' AS [MaterialActual1234567890/MaterialLot1234567890]
          ,(
          SELECT
          'CreationDate' AS [EvenMore1234567890/StillMore1234567890/MaterialActualProperty1234567890/ID1234567890]
          ,GETDATE() AS [EvenMore1234567890/StillMore1234567890/MaterialActualProperty1234567890/ValueString1234567890]
          FOR XML PATH('SomeMore1234567890'),TYPE
          ) AS [MaterialActual1234567890]
    FOR XML PATH('')
);
SELECT @xml;

ОБНОВЛЕНИЕ 3: Ваш дополнительный вопрос в комментарии

СОВЕТ. Избегайте уточняющих вопросов. В следующий раз, пожалуйста, добавьте новый вопрос!

Оба возвращают запрошенный результат:

SELECT 'yyyy-MM-dd''T''HH:mm:ss.SSSXXX' AS [PublishedDate/@format]
      ,GETDATE() AS PublishedDate
FOR XML PATH('')

SELECT 'yyyy-MM-dd''T''HH:mm:ss.SSSXXX' AS [@format]
      ,GETDATE() AS [*]
FOR XML PATH('PublishedDate');

На мой взгляд, нет необходимости в формате. В XML в любом случае datetime должен быть в этом формате (то есть ISO8601). Это стандартный формат...

person Shnugo    schedule 29.06.2017
comment
Теперь, когда я использую этот маршрут, у меня возникла проблема: я использую более 128 символов ,GETDATE() AS [SyncProductionPerformance/ProductionPerformance/ProductionResponse/SegmentResponse/MaterialActual/MaterialActualProperty/Value/ValueString] Куда вы можете указать мне? - person duckfeet23; 30.06.2017
comment
Я изо всех сил пытался воспроизвести следующий xml... <PublishedDate format="yyyy-MM-dd'T'HH:mm:ss.SSSXXX">2017-06-22T13:04:55.574-05:00</PublishedDate> Любая помощь по этому поводу? - person duckfeet23; 05.07.2017