sql-server - T-SQL - XML 路径子句不返回结果集
问题描述
感谢您的答复。不幸的是,您的代码对我没有帮助。基本上,我想从下面的查询中获取 xml 结果集,并希望以 html 表格格式显示它。然后我想通过电子邮件将数据集发送给客户端。下面是我为此编写的存储过程。EXEC dbo.usp_SFDCGradeComparison
Alter PROCEDURE dbo.usp_SFDCGradeComparison
AS
Begin
Drop table if exists #GradeREport
Select
GR.EnrollMent EnrollMent_Year_New__c
,GR.SCH_Id SCH_Id
,GR.Name SchoolName
,GR.Reporting__c
,SY.SchoolYear SchoolYear
,SY.SchoolID SchoolID
, SY.CTEGrades CTEGrades
,Case When RTRIM(LTRIM(REPLACE(GR.Reporting__c,';','')))
= RTRIM(LTRIM(REPLACE(SY.CTEGrades,',','')))
Then 'Matched'
Else 'NOT Matched' END As Comments
from #SFDC_GradeReport GR
Full Outer Join #CoreSchoolYear SY
on GR.SCH_Id = SY.SchoolID
and RTRIM(LTRIM(REPLACE(GR.Reporting__c,';',''))) =
RTRIM(LTRIM(REPLACE(SY.CTEGrades,',','')))
Where (GR.SCH_Id is null OR SY.SchoolID is null)
And GR.SCH_Id <> '005'
And ((RTRIM(LTRIM(REPLACE(SY.CTEGrades,',',''))) IS not NULL ` When I execute the script, it returns the rows in SSMS as I mentioned below. Where as in XML Path its not returning the same result set.
EnrollMent SCH_Id Name Reporting__c SchoolYear SchoolID CTEGrades Comments 2018-2019 1056 ABC School 6;7;8;9;10;11;12 NULL NULL NULL NOT Matched 2018-2019 2355 XYZ School 8;9 NULL NULL NULL NOT Matched 2018-2019 1555职业生涯 9;10; NULL NULL NULL 不匹配 2018-2019 1777 商学院 9;10; NULL NULL NULL 不匹配 2018-2019 15555 佛罗里达商学院 9;10; NULL NULL NULL 不匹配 2018-2019 2589 威斯康星商学院 9;10; NULL NULL NULL 不匹配 2018-2019 9999 HS Online Program 9;10; NULL NULL NULL 不匹配
我的预期输出
2018-20191056>ABC School9;10;11;12不匹配 2018-2019>2355>XYZ School8;9;10;不匹配但我的输出是
这里` OR RTRIM(LTRIM(REPLACE(GR.Reporting__c,';',''))) IS not NULL)) order by SCH_Id, SchoolID For xml Path('tr'), type,root('root')
设置无计数
DECLARE @profilename varchar(100) ='';
DECLARE @to varchar(200) = '';
DECLARE @subject varchar(100) ='';
DECLARE @body varchar(max) = NULL;
DECLARE @bodyhtml varchar(max) = NULL;
Declare @SuccessMessage varchar(80) = 'No record found'
set @body = cast( (
select td = CAST(s.EnrollMent_Year_New__c as varchar(30)) +'</td><td>' +
CAST(s.SCH_Id as varchar(30) ) + '</td><td>' + CAST(s.Name AS
VARCHAR(30)) + '</td><td>' + CAST(s.Reporting__c AS VARCHAR(80)) + '</td>
<td>' + CAST(s.SchoolYear AS VARCHAR(120)) + '</td><td>' +
CAST(s.SchoolID AS VARCHAR(200)) + '</td><td>' + CAST(s.CTEGrades AS
VARCHAR(80)) + '</td><td>' + CAST(s.Comments AS VARCHAR(80)) + '</td>'
from ( Select
GR.EnrollMent
,GR.SCH_Id
,GR.Name
,GR.Reporting__c
,SY.SchoolYear
,SY.SchoolID
, SY.CTEGrades CTEGrades
,Case When RTRIM(LTRIM(REPLACE(GR.Reporting__c,';','')))
= RTRIM(LTRIM(REPLACE(SY.CTEGrades,',','')))
Then 'Matched'
Else 'NOT Matched' END As Comments
from #SFDC_GradeReport GR
Full Outer Join #CoreSchoolYear SY
on GR.SCH_Id = SY.SchoolID
and RTRIM(LTRIM(REPLACE(GR.Reporting__c,';',''))) =
RTRIM(LTRIM(REPLACE(SY.CTEGrades,',','')))
Where (GR.SCH_Id is null OR SY.SchoolID is null)
And GR.SCH_Id <> '005'
And ((RTRIM(LTRIM(REPLACE(SY.CTEGrades,',',''))) IS not NULL
OR RTRIM(LTRIM(REPLACE(GR.Reporting__c,';',''))) IS not NULL))
) as s
ORDER BY SCH_Id,SchoolID For xml Path('tr'), type,root('root') ) as nvarchar(max) ) select @body print @body
IF @body IS NOT NULL -- 找到记录,发送电子邮件。BEGIN --SELECT @body set @body = '
' + 'EnrollMent_Year_New__cSCH_IdSchool NameReporting__cSchoolYearSchoolIDCTEGradesComments ' + replace( replace( @body, '<', '<' ), '>', '>' )
+ '
' 打印@body EXEC msdb .dbo.sp_send_dbmail @profile_name = @profilename,@recipients = @to,@subject = @subject,@body = @body,@body_format ='HTML'
END ELSE BEGIN PRINT @SuccessMessage END END
解决方案
确保您拥有有效的 XML 并通知 SQL 引擎您的数据类型。
- 有效的 XML:您
<td>
在开始时缺少一个开始标签。 - 数据类型:将字符串值转换为
XML
数据类型。
我没有要处理的数据#temp
,因此我S.*
在示例中替换为字段名称字符串。
SELECT
CAST( -- cast to XML data type (part 1)
'<td>' + -- add missing opening tag
CAST('EnrollMent' AS varchar(30)) +'</td><td>' +
CAST('SCH_Id' AS varchar(30)) + '</td><td>' +
CAST('SchoolName' AS varchar(100)) + '</td><td>' +
CAST('Reporting_c' AS varchar(80)) + '</td><td>' +
CAST('SchoolYear' AS varchar(30)) + '</td><td>' +
CAST('SchoolID' AS varchar(30)) + '</td><td>' +
CAST('CTEGrades' AS varchar(80)) + '</td><td>' +
CAST('Comments' AS varchar(80)) + '</td>'
AS XML) -- cast to xml data type (part 2)
FOR XML PATH('row'), TYPE, ROOT('root')
这给了我:
<root><row><td>EnrollMent</td><td>SCH_Id</td><td>SchoolName</td><td>Reporting_c</td><td>SchoolYear</td><td>SchoolID</td><td>CTEGrades</td><td>Comments</td></row></root>
或者使用一些格式:
<root>
<row>
<td>EnrollMent</td>
<td>SCH_Id</td>
<td>SchoolName</td>
<td>Reporting_c</td>
<td>SchoolYear</td>
<td>SchoolID</td>
<td>CTEGrades</td>
<td>Comments</td>
</row>
</root>
如果这不是您想要实现的目标,请使用预期输出更新您的问题。
推荐阅读
- batch-file - 如何“测试”一个变量是否大于 DOS 中的另一个变量?
- apache-superset - 如何通过超集中的 JSON 元数据设置默认过滤器值
- microsoft-graph-api - 在 Azure AD 中注册应用程序
- python - 在另一个文件中使用一个文件的变量
- redis - 为什么我在读取 redis 流时得到 (nil)
- r - 如何使用 ggplot 绘制直方图
- java - 如何使用执行器服务处理实时数据?
- bash - 查找扩展名为 .abc、.cde 和 .fgh 的文件以及文件夹内的文件夹
- git - 提交错误消息的 Git 推送镜像
- javascript - 如何禁用 onmousemove 事件但保留 onclick 事件?