TSQL:检索第一列值作为行数据,并排除 NULL 以生成 HTML table 电子邮件
TSQL: retrieve first column values as row data, and exclude NULLs to produce HTML table email
使用:Microsoft SQL Server 2014
我有一份 table 作为报告通过电子邮件发送,以表明在哪些州的销售数量(或报价请求或取消订阅的电子邮件等)发生了重大变化:
-- Sample Table
CREATE TABLE mytable(
State VARCHAR(2) NOT NULL PRIMARY KEY
,Count1 BIT
,Count2 BIT
,Count3 BIT
,Count4 BIT
,Count5 BIT
,Count6 BIT
,Count7 BIT
,Count8 BIT NOT NULL
);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('KS',NULL,1,NULL,1,1,1,1,1,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('KY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('LA',NULL,NULL,NULL,1,NULL,NULL,NULL,NULL,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('MA',NULL,1,NULL,NULL,NULL,NULL,NULL,NULL,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('MD',NULL,NULL,NULL,1,NULL,NULL,NULL,NULL,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('ME',NULL,1,NULL,NULL,1,NULL,NULL,NULL,1)
table 看起来像这样:
"State"_______"Count1"________"Count2"_____"Count3"
AK 1
AL
CA 1
CO 1
CT 1
DE 1 1
FL 1
GA 1
(很多很多计数...,每个 state/federal district/protectorate/etc。)
我用这种方式通过电子邮件发送:
DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)
--Set Data
SET @xml = CAST(( SELECT DISTINCT [State] AS 'td',''
,[Count1] AS 'td',''
,[Count2] AS 'td',''
,[Count3] AS 'td',''
FROM mytable
FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX))
--Set columns
SET @body ='
<html><body><H3>Altered State Counts</H3>
<table border = 1>
<tr>
<th>[State] </th>
<th>[Count1] </th>
<th>[Count2] </th>
<th>[Count3] </th>'
--Set table format
SET @body = @body+ @xml +'</table></body></html>'
--Send Email
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQLEMAIL',
@body = @body,
@body_format ='HTML',
@recipients = 'me@initech.com',
@subject = 'TPS Reports' ;
这有效,并生成一封 okay 电子邮件以查看您是否使用最大化的浏览器并愿意来回滚动...我真正想要的是:
.................................
TPS 报告
"Count1:" AK, CA
"Count2:" CT
"Count3:" AK, AL, CA, CO, CT, DE, FL, GA
当这些计数列下方有一个 1 时。
如果您将其放入上述代码中,它应该提供您寻求的电子邮件格式。
--Set Data
SELECT Counts, [State]
INTO #tempCounts
FROM (
SELECT [State]
,[Count1]
,[Count2]
,[Count3]
FROM mytable ) tt
UNPIVOT
(States FOR Counts IN ([Count1], [Count2], [Count3])) u
SET @xml = CAST((SELECT DISTINCT Counts AS td,'', Stuff((SELECT DISTINCT ',' + [State] FROM #tempCounts t2 WHERE t2.Counts = t1.Counts FOR XML PATH('') ), 1,1, '') AS td
FROM #tempCounts t1
FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX))
--Set Columns
如果您想添加更多列(尤其是当您的列超过 9 个时),则必须使用动态 SQL 来解决这个问题。提示,您可以使用 FOR XML PATH 列出所有列,就像您对 TR 元素所做的那样。
此外,不要忘记在过程结束时删除#tempCounts table。
使用:Microsoft SQL Server 2014
我有一份 table 作为报告通过电子邮件发送,以表明在哪些州的销售数量(或报价请求或取消订阅的电子邮件等)发生了重大变化:
-- Sample Table
CREATE TABLE mytable(
State VARCHAR(2) NOT NULL PRIMARY KEY
,Count1 BIT
,Count2 BIT
,Count3 BIT
,Count4 BIT
,Count5 BIT
,Count6 BIT
,Count7 BIT
,Count8 BIT NOT NULL
);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('KS',NULL,1,NULL,1,1,1,1,1,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('KY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('LA',NULL,NULL,NULL,1,NULL,NULL,NULL,NULL,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('MA',NULL,1,NULL,NULL,NULL,NULL,NULL,NULL,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('MD',NULL,NULL,NULL,1,NULL,NULL,NULL,NULL,1);
INSERT INTO mytable(State,MasterCount,Count1,Count2,Count3,Count4,Count5,Count6,Count7,Count8) VALUES ('ME',NULL,1,NULL,NULL,1,NULL,NULL,NULL,1)
table 看起来像这样:
"State"_______"Count1"________"Count2"_____"Count3"
AK 1
AL
CA 1
CO 1
CT 1
DE 1 1
FL 1
GA 1
(很多很多计数...,每个 state/federal district/protectorate/etc。)
我用这种方式通过电子邮件发送:
DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)
--Set Data
SET @xml = CAST(( SELECT DISTINCT [State] AS 'td',''
,[Count1] AS 'td',''
,[Count2] AS 'td',''
,[Count3] AS 'td',''
FROM mytable
FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX))
--Set columns
SET @body ='
<html><body><H3>Altered State Counts</H3>
<table border = 1>
<tr>
<th>[State] </th>
<th>[Count1] </th>
<th>[Count2] </th>
<th>[Count3] </th>'
--Set table format
SET @body = @body+ @xml +'</table></body></html>'
--Send Email
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQLEMAIL',
@body = @body,
@body_format ='HTML',
@recipients = 'me@initech.com',
@subject = 'TPS Reports' ;
这有效,并生成一封 okay 电子邮件以查看您是否使用最大化的浏览器并愿意来回滚动...我真正想要的是:
.................................
TPS 报告
"Count1:" AK, CA
"Count2:" CT
"Count3:" AK, AL, CA, CO, CT, DE, FL, GA
当这些计数列下方有一个 1 时。
如果您将其放入上述代码中,它应该提供您寻求的电子邮件格式。
--Set Data
SELECT Counts, [State]
INTO #tempCounts
FROM (
SELECT [State]
,[Count1]
,[Count2]
,[Count3]
FROM mytable ) tt
UNPIVOT
(States FOR Counts IN ([Count1], [Count2], [Count3])) u
SET @xml = CAST((SELECT DISTINCT Counts AS td,'', Stuff((SELECT DISTINCT ',' + [State] FROM #tempCounts t2 WHERE t2.Counts = t1.Counts FOR XML PATH('') ), 1,1, '') AS td
FROM #tempCounts t1
FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX))
--Set Columns
如果您想添加更多列(尤其是当您的列超过 9 个时),则必须使用动态 SQL 来解决这个问题。提示,您可以使用 FOR XML PATH 列出所有列,就像您对 TR 元素所做的那样。
此外,不要忘记在过程结束时删除#tempCounts table。