Sup*_*ral 4 xml sql-server t-sql
我有以下查询:
SELECT
[ID] AS [NewID]
, (
CASE WHEN LEN([MiddleName]) > 0 THEN
[LastName] + ', ' + [FirstName] + ' ' + LEFT([MiddleName],1) + '.'
ELSE
[LastName] + ', ' + [FirstName]
END
) AS [Name]
, [Title] AS [ProfTitle]
, CONVERT(CHAR(10),[DepartureDate],111) AS [BorDepart]
, [LocationOfficeNumber] AS [OfficePhone]
, [Location]
, [LocationSection] AS [Sec]
, [PracticeGroup] AS [PracticeTL]
, [Email]
FROM [dbo].[Borrowers]
Run Code Online (Sandbox Code Playgroud)
有了这个,我想知道如何编写一个转换为这个输出的 FOR XML 查询:
<sydney>
<import>
<template id="Borrower" name="Borrowers">
<record searchfield="NewID" searchvalue="NewID">
<field id="NewID">
<![CDATA[NEWID]]>
</field>
<field id="Name">
<![CDATA[NAME]]>
</field>
<field id="ProfTitle">
<![CDATA[Professional Title]]>
</field>
<field id="BorDepart">
<![CDATA[YYYY/MM/DD]]>
</field>
<field id="OfficePhone">
<![CDATA[office phone]]>
</field>
<link id="Location" linkfield="Code">
<![CDATA[011]]>
</link>
<link id="Sec" linkfield="Term">
<![CDATA[SECTION]]>
</link>
<link id="PracticeTL" linkfield="Term">
<![CDATA[SUBSECTION]]>
</link>
<field id="Email">
<![CDATA[email]]>
</field>
</record>
</template>
</import>
</sydney>
Run Code Online (Sandbox Code Playgroud)
我已经尝试了 FOR XML PATH 和 FOR XML EXPLICIT 的各种组合,但找不到任何答案。我最接近的是这个:
SELECT (
SELECT
'Borrower' AS '@id'
, 'Borrowers' AS '@name'
, (
SELECT
'NewID' AS '@searchfield'
, 'NewID' AS '@searchvalue'
, [ID] AS 'NewID' --AS [Field!1!CDATA]
, (
CASE WHEN LEN([MiddleName]) > 0 THEN
[LastName] + ', ' + [FirstName] + ' ' + LEFT([MiddleName],1) + '.'
ELSE
[LastName] + ', ' + [FirstName]
END
) AS [Name]
, [Title] AS [ProfTitle]
, CONVERT(CHAR(10),[DepartureDate],111) AS [BorDepart]
, [LocationOfficeNumber] AS [OfficePhone]
, [Location]
, [LocationSection] AS [Sec]
, [PracticeGroup] AS [PracticeTL]
, [Email]
FROM [dbo].[Borrowers]
FOR XML PATH('record'), TYPE
)
FOR XML PATH('template'), TYPE
) AS 'import'
FOR XML PATH('sydney'), TYPE
Run Code Online (Sandbox Code Playgroud)
欢迎任何帮助,因为我已经坚持了一个星期并且找不到任何东西。
PS:这是 Borrowers 表的架构:
干杯,
阿尔瓦罗·科斯塔
这是一个工作FOR XML EXPLICIT
示例。它们有点难以编码,但我倾向于逐节构建它们,因此它们还不错:
USE tempdb
GO
SET NOCOUNT ON
GO
IF OBJECT_ID('dbo.Borrowers') IS NOT NULL DROP TABLE dbo.Borrowers
CREATE TABLE dbo.Borrowers
(
ID INT IDENTITY PRIMARY KEY,
FirstName VARCHAR(30),
MiddleName VARCHAR(30),
LastName VARCHAR(30),
Title VARCHAR(30),
DepartureDate DATE,
LocationOfficeNumber VARCHAR(30),
Location VARCHAR(30),
LocationSection VARCHAR(30),
PracticeGroup VARCHAR(30),
Email VARCHAR(30)
)
GO
INSERT INTO dbo.Borrowers( FirstName, MiddleName, LastName, Title, DepartureDate, LocationOfficeNumber, Location, LocationSection, PracticeGroup, Email )
VALUES
( 'Alvaro', 'X', 'Costa', 'Mr', GETDATE(), '000-000', 'Location 1', 'Location Section 2', 'Practice Group 3', 'alvaro@nospam.com' ),
( 'w', '', 'Bob', 'Mr', GETDATE(), '000-007', 'Location 2', 'Location Section 3', 'Practice Group 4', 'wBob@nospam.com' )
GO
SELECT
1 AS Tag
, NULL AS Parent
, NULL AS [import!1]
, NULL AS [template!2!id]
, NULL AS [template!2!name]
, NULL AS [record!3!searchfield]
, NULL AS [record!3!searchvalue]
, NULL AS [record!3!sort!HIDE]
, NULL AS [field!4!id] -- NewID
, NULL AS [field!4!!CDATA]
, NULL AS [field!4!id] -- Name
, NULL AS [field!4!!CDATA]
, NULL AS [field!4!id] -- ProfTitle
, NULL AS [field!4!!CDATA]
, NULL AS [field!4!id] -- BorDepart
, NULL AS [field!4!!CDATA]
, NULL AS [field!4!id] -- OfficePhone
, NULL AS [field!4!!CDATA]
, NULL AS [link!5!id] -- Location
, NULL AS [link!5!linkfield]
, NULL AS [link!5!!CDATA]
, NULL AS [link!5!id] -- Sec
, NULL AS [link!5!linkfield]
, NULL AS [link!5!!CDATA]
, NULL AS [link!5!id] -- PracticeTL
, NULL AS [link!5!linkfield]
, NULL AS [link!5!!CDATA]
, NULL AS [field!4!id] -- Email
, NULL AS [field!4!!CDATA]
UNION ALL
SELECT
2
, 1
, NULL
, 'Borrower'
, 'Borrowers'
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
UNION ALL
SELECT
3
, 2
, NULL
, NULL
, NULL
, 'NewID'
, 'NewID'
, ID
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
FROM dbo.Borrowers
UNION ALL
SELECT
4
, 3
, NULL
, NULL
, NULL
, NULL
, NULL
, ID
, 'NewID'
, ID
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
FROM dbo.Borrowers
UNION ALL
SELECT
4
, 3
, NULL
, NULL
, NULL
, NULL
, NULL
, ID
, NULL
, NULL
, 'Name'
, LastName
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
FROM dbo.Borrowers
UNION ALL
SELECT
4
, 3
, NULL
, NULL
, NULL
, NULL
, NULL
, ID
, NULL
, NULL
, NULL
, NULL
, 'ProfTitle'
, Title
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
FROM dbo.Borrowers
UNION ALL
SELECT
4
, 3
, NULL
, NULL
, NULL
, NULL
, NULL
, ID
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, 'BorDepart'
, CONVERT( CHAR(10), DepartureDate, 111 )
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
FROM dbo.Borrowers
UNION ALL
SELECT
4
, 3
, NULL
, NULL
, NULL
, NULL
, NULL
, ID
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, 'OfficePhone'
, LocationOfficeNumber
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
FROM dbo.Borrowers
UNION ALL
SELECT
5
, 3
, NULL
, NULL
, NULL
, NULL
, NULL
, ID
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, 'Location'
, 'Code'
, Location
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
FROM dbo.Borrowers
UNION ALL
SELECT
5
, 3
, NULL
, NULL
, NULL
, NULL
, NULL
, ID
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, 'Sec'
, 'Term'
, LocationSection
, NULL
, NULL
, NULL
, NULL
, NULL
FROM dbo.Borrowers
UNION ALL
SELECT
5
, 3
, NULL
, NULL
, NULL
, NULL
, NULL
, ID
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, 'PracticeTL'
, 'Term'
, PracticeGroup
, NULL
, NULL
FROM dbo.Borrowers
UNION ALL
SELECT
4
, 3
, NULL
, NULL
, NULL
, NULL
, NULL
, ID
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, 'Email'
, Email
FROM dbo.Borrowers
ORDER BY [record!3!sort!HIDE]
FOR XML EXPLICIT, ROOT('sydney')
Run Code Online (Sandbox Code Playgroud)
HTH
如果你这样做,'NewID' as [field/@id]
你会得到一个field
带有id
属性的元素。在下一行中,您添加B.ID as [field]
的值ID
作为field
您之前在该行上创建的节点的节点值。
<field id="NewID">1</field>
Run Code Online (Sandbox Code Playgroud)
之后,您需要一个新field
节点并创建该节点,您可以使用一个没有名称的节点null as [*]
作为field
节点之间的分隔符。
这是用于您要创建的每个字段节点的模式。
'NewID' as [field/@id],
B.ID as [field],
null as [*],
Run Code Online (Sandbox Code Playgroud)
您的查询将如下所示。
select 'Borrower' as [template/@id],
'Borrowers' as [template/@name],
(
select 'NewID' as [@searchfield],
'NewID' as [@searchvalue],
'NewID' as [field/@id],
B.ID as [field],
null as [*],
'Name' as [field/@id],
case when len(B.MiddleName) > 0
then B.LastName + ', ' + B.FirstName + ' ' + left(B.MiddleName, 1) + '.'
else B.LastName + ', ' + B.FirstName
end as [field],
null as [*],
'ProfTitle' as [field/@id],
B.Title as [field]
from dbo.Borrowers as B
for xml path('record'), type
) as 'template'
for xml path('import'), root('sydney')
Run Code Online (Sandbox Code Playgroud)
结果
<sydney>
<import>
<template id="Borrower" name="Borrowers">
<record searchfield="NewID" searchvalue="NewID">
<field id="NewID">1</field>
<field id="Name">Last, First M.</field>
<field id="ProfTitle">Tit</field>
</record>
</template>
</import>
</sydney>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4222 次 |
最近记录: |