从 SQL Table 创建 XML (独特的 XML 格式)

Creating XML from SQL Table (Unique XML formatting)

因此,我正在尝试从 SQL table 创建一个 XML 文件。我知道使用的路线...

Select * From dbo.[db_name]
FOR XML PATH

但手头的问题是 XML styling/formatting 很奇怪...

                    <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 

但是当我这样做的时候我被退回了...

如果我能指出正确的方向,甚至是一个例子,那就太好了!

But the issue at hand is that the XML styling/formatting is quite odd...

有什么奇怪的?我能看到的唯一奇怪的是尝试在字符串级别解决这个问题...

您的问题缺少示例数据和预期输出。您提供的简单 select 什么也没告诉我们,您提供的 XML 是一个 inclompete 片段,实际示例完全不同...

一些提示:

您的简单示例应该这样完成:

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

--这是一个解决方案:嵌套子-select:

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:您在评论中提出的后续问题

提示:避免后续问题。下次请添加新问题!

两者都return要求的结果:

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)。这是标准格式...