如何将 SQL 转换为每个 ID 一行的 XML 架构(对于 XML RAW)



我必须使用每个ID只做一行的模式将SQL转换为XML文件。该查询转换 ID 的"文档",并将它们全部放入一行架构中。它应该使用节点"documentData"向现有ID行添加其他文档,而不是为每个文档创建新行

为测试弹出创建和插入语句:

CREATE TABLE person  
(
birthDate varchar(255),
lastName varchar(255),
firstName varchar(255), 
externalStudentId3 varchar(255),
externalStudentId2 varchar(255),
externalStudentId1 varchar(255),
socialSecurityNumber varchar(255),  
documentRequirementStatusChangeOnDate datetime, 
reason varchar(255),    
scopeValue varchar(255),     
documentScope varchar(255), 
status varchar(255),    
documentName varchar(255),  
externalDocumentId varchar(255),    
dateReviewed datetime,
dateReceived datetime,
dateCreated datetime,
documentRequirementExternalId varchar(255)
)
INSERT INTO person
VALUES ('19540309','Smith','Jon','100000166','3014925','3014925','999999999',NULL,NULL,NULL,'PERSON','UNSATISFIED','ApplicationUpdate','Application_Update','20190222','20190223','20190224','01309757'),
('19540309','Smith','Jon','100000166','3014925','3014925','999999999','20190220','Document added to wrong year requirement.','2020','AwardYear','SATISFIED','CertOne','Cert_one','20190221','20190220','20190220','01294555')

示例数据:

示例数据的 Excel 屏幕截图

birthDate           lastName    firstName   externalStudentId3  externalStudentId2  externalStudentId1  socialSecurityNumber    documentRequirementStatusChangeOnDate   reason                                      scopeValue  documentScope   status      documentName        externalDocumentId  dateReviewed                    dateReceived                    dateCreated                     documentRequirementExternalId
1954-03-09-05:00    Smith       Jon         100000166           3014925             3014925             999999999               NULL                                    NULL                                        NULL        PERSON          UNSATISFIED ApplicationUpdate   Application_Update  2019-12-05T08:40:17.737-05:00   2019-12-05T08:40:17.737-05:00   2019-12-05T08:40:17.737-05:00   01-309757
1954-03-09-05:00    Smith       Jon         100000166           3014925             3014925             999999999               2019-02-20T10:54:08.670-05:00

每个 ID 拉取多行的当前代码:

SELECT
DISTINCT
s.dateOfBirth as birthDate
,s.lastName
,s.firstName
,s.externalId3 as externalStudentId3
,s.externalId2 as externalStudentId2
,s.externalid1 as externalStudentId1
,s.socialSecurityNumber as socialSecurityNumber
,s.message as reason
,s.documentScopeCode as documentScope
,s.documentRequirementStatusCode as status
,s.name as documentName
,s.externalId as externalDocumentId
,s.revieweddate as dateReviewed
,s.receiveddate as dateReceived
,s.createddate as dateCreated
,s.documentRequirementExternalId as documentRequirementExternalId
FROM dbo.[person] s
FOR XML RAW ('student'), ROOT ('students');`

电流输出:

当前输出屏幕截图

<persons>
<person birthDate="1954-03-09-05:00" lastName="Smith" firstName="Jon" externalStudentId3="100000166" 
externalStudentId2="3014925" externalStudentId1="3014925" socialSecurityNumber="999999999" 
documentScope="PERSON" status="UNSATISFIED" documentName="ApplicationUpdate" 
externalDocumentId="Application_Update" dateReceived="2019-12-05T08:40:17.737-05:00" 
dateCreated="2019-12-05T08:40:17.737-05:00" documentRequirementExternalId="01-309757" />
<person birthDate="1954-03-09-05:00" lastName="Smith" firstName="Jon" externalStudentId3="100000166" 
externalStudentId2="3014925" externalStudentId1="3014925" socialSecurityNumber="999999999" 
documentRequirementStatusChangeOnDate="2019-02-20T10:54:08.670-05:00" reason="Document added to 
wrong year requirement." scopeValue="2020" documentScope="AwardYear" status="SATISFIED" 
documentName="CertOne" externalDocumentId="Cert_one" dateReviewed="2019-02-20T10:54:08.670-05:00" 
dateReceived="2019-02-19T13:35:03.143-05:00" dateCreated="2019-02-15T14:19:02.417-05:00" 
documentRequirementExternalId="01-294517" />
</person>

期望输出:

所需的输出屏幕截图

<?xml version='1.0' encoding='UTF-8'?>
<persons>
<person birthDate="1954-03-09-05:00" lastName="Smith" firstName="Jon" externalStudentId3="100000166" externalStudentId2="3014925" externalStudentId1="3014925" socialSecurityNumber="999999999"><documentData documentScope="PERSON" status="UNSATISFIED" documentName="ApplicationUpdate" externalDocumentId="Application_Update" dateReceived="2019-12-  05T08:40:17.737-05:00" dateCreated="2019-12-05T08:40:17.737-05:00" documentRequirementExternalId="01-309757" /><documentData documentRequirementStatusChangeOnDate="2019-02-20T10:54:08.670-05:00" reason="Document added to  wrong year requirement." scopeValue="2020" documentScope="AwardYear" status="SATISFIED" documentName="CertOne" externalDocumentId="Cert_one" dateReviewed="2019-02-20T10:54:08.670-05:00" dateReceived="2019-02-19T13:35:03.143-05:00" dateCreated="2019-02-15T14:19:02.417-05:00" documentRequirementExternalId="01-294517" />
</person>
</persons>

看看吧。我用了很少的列来展示这个概念。您可以轻松地将其扩展为完整解决方案。

.SQL

USE tempdb;
GO
-- DDL and sample data population, start
DROP TABLE IF EXISTS dbo.person;
CREATE TABLE dbo.person  
(
birthDate varchar(255),
lastName varchar(255),
firstName varchar(255), 
externalStudentId3 varchar(255),
externalStudentId2 varchar(255),
externalStudentId1 varchar(255),
socialSecurityNumber varchar(255),  
documentRequirementStatusChangeOnDate datetime, 
reason varchar(255),    
scopeValue varchar(255),     
documentScope varchar(255), 
status varchar(255),    
documentName varchar(255),  
externalDocumentId varchar(255),    
dateReviewed datetime,
dateReceived datetime,
dateCreated datetime,
documentRequirementExternalId varchar(255)
);
INSERT INTO dbo.person
VALUES ('19540309','Smith','Jon','100000166','3014925','3014925','999999999',NULL,NULL,NULL,'PERSON','UNSATISFIED','ApplicationUpdate','Application_Update','20190222','20190223','20190224','01309757')
, ('19540309','Smith','Jon','100000166','3014925','3014925','999999999','20190220','Document added to wrong year requirement.','2020','AwardYear','SATISFIED','CertOne','Cert_one','20190221','20190220','20190220','01294555');
-- DDL and sample data population, end
;WITH rs AS
(
-- select columns pertaining to the person only
SELECT DISTINCT externalStudentId3
, firstName
, lastName
FROM dbo.person
)
SELECT p.externalStudentId3 AS [@id]
, p.firstName AS [@firstName]
, p.lastName AS [@lastName]
, (SELECT c.externalStudentId3 AS [@id]
,c.documentScope AS [@documentScope]
,c.documentName AS [@documentName]
FROM dbo.person AS c
WHERE c.externalStudentId3 = p.externalStudentId3
FOR XML PATH('documentData'), TYPE)
FROM rs AS p
FOR XML PATH('person'), ROOT('persons');

输出

<persons>
<person id="100000166" firstName="Jon" lastName="Smith">
<documentData id="100000166" documentScope="PERSON" documentName="ApplicationUpdate" />
<documentData id="100000166" documentScope="AwardYear" documentName="CertOne" />
</person>
</persons>

您可以使用 FOX XML PATH 来实现此目的。我无法测试代码,可能需要进行一些调整:

CREATE TABLE person  
(
birthDate varchar(255),
lastName varchar(255),
firstName varchar(255), 
externalStudentId3 varchar(255),
externalStudentId2 varchar(255),
externalStudentId1 varchar(255),
socialSecurityNumber varchar(255),  
documentRequirementStatusChangeOnDate datetime, 
reason varchar(255),    
scopeValue varchar(255),     
documentScope varchar(255), 
status varchar(255),    
documentName varchar(255),  
externalDocumentId varchar(255),    
dateReviewed datetime,
dateReceived datetime,
dateCreated datetime,
documentRequirementExternalId varchar(255)
)
INSERT INTO person
VALUES ('19540309','Smith','Jon','100000166','3014925','3014925','999999999',NULL,NULL,NULL,'PERSON','UNSATISFIED','ApplicationUpdate','Application_Update','20190222','20190223','20190224','01309757'),
('19540309','Smith','Jon','100000166','3014925','3014925','999999999','20190220','Document added to wrong year requirement.','2020','AwardYear','SATISFIED','CertOne','Cert_one','20190221','20190220','20190220','01294555')

;WITH cte_person(birthDate,lastName,firstName,externalStudentId3,externalStudentId2,externalStudentId1,socialSecurityNumber)
AS
(
SELECT DISTINCT
s.birthDate as birthDate
,s.lastName
,s.firstName
,s.externalStudentId3
,s.externalStudentId2
,s.externalStudentId1
,s.socialSecurityNumber as socialSecurityNumber
FROM dbo.[person] s
)
SELECT
s.birthDate as '@birthDate'
,s.lastName as '@lastName'
,s.firstName as '@firstName'
,s.externalStudentId3 as '@externalStudentId3'
,s.externalStudentId2 as '@externalStudentId2'
,s.externalStudentId1 as '@externalStudentId1'
,s.socialSecurityNumber as '@socialSecurityNumber',
(SELECT
d.documentScope as '@documentScope'
,d.reason as '@reason'
,d.status as '@status'
,d.documentName as '@documentName'
,d.externalDocumentId as '@externalDocumentId'
,d.dateReviewed as '@dateReviewed'
,d.dateReceived as '@dateReceived'
,d.dateCreated as '@dateCreated'
,d.documentRequirementExternalId as '@documentRequirementExternalId'
FROM dbo.[person] d
WHERE d.socialSecurityNumber=s.socialSecurityNumber
FOR XML PATH ('documentData'), TYPE)
FROM cte_person s
FOR XML PATH ('student'), ROOT ('students');

输出:

<students>
<student birthDate="19540309" lastName="Smith" firstName="Jon" externalStudentId3="100000166" externalStudentId2="3014925" externalStudentId1="3014925" socialSecurityNumber="999999999">
<documentData documentScope="PERSON" status="UNSATISFIED" documentName="ApplicationUpdate" externalDocumentId="Application_Update" dateReviewed="2019-02-22T00:00:00" dateReceived="2019-02-23T00:00:00" dateCreated="2019-02-24T00:00:00" documentRequirementExternalId="01309757" />
<documentData documentScope="AwardYear" reason="Document added to wrong year requirement." status="SATISFIED" documentName="CertOne" externalDocumentId="Cert_one" dateReviewed="2019-02-21T00:00:00" dateReceived="2019-02-20T00:00:00" dateCreated="2019-02-20T00:00:00" documentRequirementExternalId="01294555" />
</student>
</students>

最新更新