Но проблема в том, что стиль/форматирование 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