从 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 片段,实际示例完全不同...
一些提示:
- 不要在字符串级别连接 XML!
- 请阅读How to ask a good SQL question
- 和How to create a MCVE
您的简单示例应该这样完成:
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)。这是标准格式...
因此,我正在尝试从 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 片段,实际示例完全不同...
一些提示:
- 不要在字符串级别连接 XML!
- 请阅读How to ask a good SQL question
- 和How to create a MCVE
您的简单示例应该这样完成:
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)。这是标准格式...