请有人帮我提供XML输出模板。客户端已要求我创建xml输出文件。然后,此文件将输入客户的CRM。因此,它必须与客户请求的模板完全匹配。我已经成功地将它与CDATA完美地匹配了几个领域。
下面的是可用于测试目的的查询。我需要将CDATA换行用于Client和Area字段。我还通过运行以下代码
附加了我得到的输出 If OBJECT_ID('tempdb..#Temp') is Not NULL
Drop table #Temp
CREATE TABLE #Temp
(
[ShiftDate] [date] NULL,
[Ref_Num] [varchar](20) NULL,
[Agency_Worker_Name] [varchar](100) NULL,
[Client] [varchar](100) NULL,
[Area] [VarChar] (100) Null,
[Assignment] [varchar](20) NULL,
[Contract_Start] [varchar](30) NULL,
[Contract_End] [varchar](30) NULL,
[Contract_BreakInMinutes] [varchar](10) NULL,
[Contract_Total] [varchar](30) NULL,
[Actual_Start] [varchar](30) NULL,
[Actual_End] [varchar](30) NULL,
[Actual_BreakInMinutes] [varchar](10) NULL,
[Actual_Total] [varchar](30) NULL,
[Commission] [decimal](18, 2) NULL,
[Total_Cost] [decimal](18, 2) NULL,
[Rate] [varchar](20) NULL,
[OverallCost] [decimal](18, 2) NULL,
[AgencybackingReport] [int] NULL,
[AccountCode] [varchar](20) NULL
)
Insert Into #Temp
Values
('2018-07-24',
'83076641',
'ABCD',
'ABCD',
'ABCD',
'CPA00',
'09:00',
'17:00',
'30',
'07:30',
'10:30',
'17:00',
'30',
'05:30',
'28.49',
'159.01',
'Basic',
'221.59',
'1220883',
' ABCD')
Declare @xml Int=(Select max(AgencyBackingReport) From #Temp)
select @xml As [@AgencyBackingReport],(Select
[Ref_Num] As [@reference],
[ShiftDate] as [@startdate],
Case When [AccountCode] is NULL Then 'Unknown' Else [AccountCode] End as [@accountcode],
Contract_Start As 'PlannedShift/Start',
Contract_End As 'PlannedShift/End',
Contract_BreakInMinutes As 'PlannedShift/BreakinMinutes',
Actual_Start As 'ActualShift/Start',
Actual_End As 'ActualShift/End',
Actual_BreakInMinutes As 'ActualShift/BreakinMinutes',
OverallCost As [OverallCost],
Agency_Worker_Name As 'AdditionalInformation/WorkerName',
Client As 'AdditionalInformation/Client',
Area As 'AdditionalInformation/Area',
-- ( select
-- 1 as Tag ,
-- 0 as Parent ,
-- (Select
-- Area
-- From #Temp M2
-- Where M1.Ref_Num = m2.Ref_Num)
-- As [Area!1!!CDATA]
-- for xml explicit
--) As 'AdditionalInformation/Area',
Assignment As 'AdditionalInformation/Assignment',
Commission As 'AdditionalInformation/Commission',
Total_Cost As 'AdditionalInformation/TotalCost',
Rate As 'AdditionalInformation/Rate'
From #Temp M1
for xml path('Shift'),Type)
for XML Path('Shifts'),Type
答案 0 :(得分:2)
您似乎知道CDATA
已经过时了...如果您想阅读有关此内容的信息,可以关注this link及其答案中的链接。
有时候我们必须坚持下去……特别是如果第三方工具做得不好的话。但是...
包含CDATA
部分的唯一方法是使用FOR XML EXPLICIT
,但这很笨拙。
每当将包含CDATA
节的XML从字符串类型转换为本机XML时,您的CDATA都会丢失,并且将是正确转义的常规text()
节点。
尝试一下
DECLARE @tbl TABLE(XmlAsString NVARCHAR(MAX), NativeXml XML);
INSERT INTO @tbl
SELECT (
SELECT 1 AS Tag
,NULL AS Parent
,'test <&>' AS [SomeNode!1!!cdata]
FOR XML EXPLICIT
)
,(
SELECT 1 AS Tag
,NULL AS Parent
,'test <&>' AS [SomeNode!1!!cdata]
FOR XML EXPLICIT
);
SELECT * FROM @tbl
结果
<SomeNode><![CDATA[test <&>]]></SomeNode>
<SomeNode>test <&></SomeNode>
简而言之:保留CDATA节将迫使您保持字符串类型。可能会大大缩水...
如果我正确地看到了这一点,则希望获得上述所有内容,但是
<Area><![CDATA[ABCD]]></Area>
...而不是
<Area>ABCD</Area>
按照上述操作创建XML,然后读取 <Area>
的内容,并在字符串级别使用REPLACE
来彻底更改此节点。但是您永远不能将其转换回XML ...
这是带有CDATA
部分的XML,不是绝对完整,但是您会看到一些原理:
SELECT 1 AS Tag
,NULL AS Parent
,1220883 AS [Shifts!1!AgencyBackingReport]
,NULL AS [Shift!2!reference]
,NULL AS [Shift!2!startdate]
,NULL AS [Shift!2!accountcode]
,NULL AS [PlannedShift!3!Start!Element]
,NULL AS [PlannedShift!3!End!Element]
,NULL AS [PlannedShift!3!BreakingMinutes!Element]
,NULL AS [ActualShift!4!dummy!Element] --just a dummy
,NULL AS [OverallCost!5]
,NULL AS [AdditionalInformation!6!WorkerName!Element]
,NULL AS [AdditionalInformation!6!Area!CDATA]
,NULL AS [AdditionalInformation!6!Assignment!Element]
UNION ALL
SELECT 2
,1
,NULL
,83076641
,'2018-07-24'
,'ABCD'
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
UNION ALL
SELECT 3
,2
,NULL
,NULL
,NULL
,NULL
,'09:00'
,'17:00'
,30
,NULL
,NULL
,NULL
,NULL
,NULL
UNION ALL
SELECT 4 --just a dummy
,2
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,'dummy'
,NULL
,NULL
,NULL
,NULL
UNION ALL
SELECT 5
,2
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,211.59
,NULL
,NULL
,NULL
UNION ALL
SELECT 6
,2
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,NULL
,'ABCD'
,'ABCD'
,'CPA00'
FOR XML EXPLICIT
结果
<Shifts AgencyBackingReport="1220883">
<Shift reference="83076641" startdate="2018-07-24" accountcode="ABCD">
<PlannedShift>
<Start>09:00</Start>
<End>17:00</End>
<BreakingMinutes>30</BreakingMinutes>
</PlannedShift>
<ActualShift>
<dummy>dummy</dummy>
</ActualShift>
<OverallCost>211.59</OverallCost>
<AdditionalInformation>
<WorkerName>ABCD</WorkerName>
<Area><![CDATA[ABCD]]></Area>
<Assignment>CPA00</Assignment>
</AdditionalInformation>
</Shift>
</Shifts>
答案 1 :(得分:1)
在查询中使用FOR XML。
E.g: select * from table1 FOR XML AUTO
这样的声明(基于臭名昭著):
SELECT
CustomerID as "@CustomerID",
CompanyName,
Address as "address/street",
City as "address/city",
Region as "address/region",
PostalCode as "address/zip",
Country as "address/country",
ContactName as "contact/name",
ContactTitle as "contact/title",
Phone as "contact/phone",
Fax as "contact/fax"
FROM Customers
FOR XML PATH('Customer')