【问题标题】:Creating XML from SQL Table (Unique XML formatting)从 SQL 表创建 XML(唯一的 XML 格式)
【发布时间】:2017-06-29 20:45:07
【问题描述】:

所以,我正在尝试从 SQL 表创建 XML 文件。我知道使用的路线...

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 

但是当我这样做时,我会被退回......

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

【问题讨论】:

标签: sql-server xml tsql xpath for-xml-path


【解决方案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...

这是你的错误:name-length more than 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)。这是标准格式...

【讨论】:

  • 现在我正在使用这条路线,我遇到了一个问题,我使用了超过 128 个字符 ,GETDATE() AS [SyncProductionPerformance/ProductionPerformance/ProductionResponse/SegmentResponse/MaterialActual/MaterialActualProperty/Value/ValueString] 任何地方你可以指点我吗?
  • 我一直在努力复制以下 xml...&lt;PublishedDate format="yyyy-MM-dd'T'HH:mm:ss.SSSXXX"&gt;2017-06-22T13:04:55.574-05:00&lt;/PublishedDate&gt; 对此有什么帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多