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。