none
sql mail html 無法顯示

    問題

  • 請問一下各位先進

    我嘗試要透過SQL自動發送MAIL

    但選擇HTML格式 收的郵件一片空白,能幫忙看一下嗎

    DECLARE @tableHTML  NVARCHAR(MAX) ;   
    SET @tableHTML =   
        N'<H1>當日客戶訂單資訊</H1>' +   
        N'<table border="1">' +   
        N'<tr><th>單    別</th>' +   
            N'<th>單    號</th>' +
            N'<th>客戶代號</th>' +
            N'<th>確 認 碼</th>' +
            N'<th>品    號</th>' +       
            N'<th>預 交 日</th></tr>' +   
        CAST ( ( SELECT td =TC001,   '',       
                        td = TC002,  '',
                        td = TC004,  '',
                        td = TC027,  '',
                        td = TD004,  '',
                        td = TD008,  '',   
                        td = TD013    
                   FROM  EPO.dbo.COPTC INNER JOIN EPO.dbo.COPTD ON COPTC.TC001=COPTD.TD001 AND COPTC.TC002=COPTD.TD002 where TC001='DSO1' AND TC027<>'V' AND TC039=CONVERT(varchar(8), GETDATE(),112) 
                   FOR XML PATH('tr'), TYPE   
        ) AS NVARCHAR(MAX) ) +  
        N'</table>' ;   
    EXEC msdb.dbo.sp_send_dbmail  
    @profile_name = 'ERPSQL', --sql server中dbmail的profile名稱  
    @recipients = 'abc@yahoo.com',  --收件者  
    @body = @tableHTML,  --內文的來源為變數  
    @body_format = 'HTML' ,  --設定內文格式為html  
    @subject = '當日客戶訂單資訊通知' ;    --主旨


    • 已編輯 tarky684 2012年5月8日 上午 08:25
    2012年5月8日 上午 02:21

解答

  • 因為我沒有你的TABLE SCHEMA,所以我以Northwind資料庫來模擬你的狀況,希望對你有幫助。

    DECLARE @tableHTML  NVARCHAR(MAX) ;    
    SET @tableHTML =    
        N'<H1>Region Info</H1>' +    
        N'<table border="1">' +    
        N'<tr><th>Region ID</th>' +                  
        N'<th>Region Description</th></tr>' +   
     CAST ( ( SELECT td =RegionID,   '',        
                        td = LTRIM(RTRIM(RegionDescription))
                   FROM  Region
                   FOR XML PATH('tr'), TYPE    
        ) AS NVARCHAR(MAX) ) +   
        N'</table>' ;    
       
    EXEC msdb.dbo.sp_send_dbmail   
    @profile_name = 'ERPSQL', --sql server中dbmail的profile名稱   
    @recipients = 'abc@yahoo.com',  --收件者   
    @body = @tableHTML,  --內文的來源為變數   
    @body_format = 'HTML' ,  --設定內文格式為html   
    @subject = 'D-MAX當日客戶訂單資訊通知' ;    --主旨

    執行結果:


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月8日 上午 07:07
  •  其實用我上面提供的做法就可以達到你的需求了。

    DECLARE @tableHTML  NVARCHAR(MAX) ;    
    SET @tableHTML =    
        N'<H1>Region Info</H1>' +    
        N'<table border="1">' +    
        N'<tr><th>Region ID</th>' +                  
        N'<th>Region Description</th></tr>' +   
     CAST ( (SELECT ISNULL(t.td,'<td colspan=''2''>No Data</td>')
    			  FROM 
    			  (
    			  (SELECT td =RegionID,   '',        
                        td = LTRIM(RTRIM(RegionDescription))
                   FROM  Region
    			   WHERE RegionID = 100
                   FOR XML PATH('tr'), TYPE    			
    			)) t(td))
    	AS NVARCHAR(MAX) ) +   
        N'</table>' +
    	N'<H1>Region Info</H1>' +    
        N'<table border="1">' +    
        N'<tr><th>Region ID</th>' +                  
        N'<th>Region Description</th></tr>' +   
     CAST ( (SELECT ISNULL(t.td,'<td colspan=''2''>No Data</td>')
    			  FROM 
    			  (
    			  (SELECT td =RegionID,   '',        
                        td = LTRIM(RTRIM(RegionDescription))
                   FROM  Region
    			   WHERE RegionID = 1
                   FOR XML PATH('tr'), TYPE    			
    			)) t(td))
    	AS NVARCHAR(MAX) ) +   
        N'</table>'
    SELECT @tableHTML


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月16日 下午 10:18

所有回覆

  • 請問你直接SELECT @tableHTML內容會是空白的嗎?

    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月8日 上午 02:27
  • 收到MAIL 的內容是一片空白
    2012年5月8日 上午 03:09
  • 收到MAIL 的內容是一片空白

    不好意思,我指的是你直接在SSMS中執行下列T-SQL可以查的到資料嗎?

    DECLARE @tableHTML  NVARCHAR(MAX) ;    
    SET @tableHTML =    
        N'<H1>當日客戶訂單資訊</H1>' +    
        N'<table border="1">' +    
        N'<tr><th>單    別</th>' +    
            N'<th>單    號</th>' +
            N'<th>客戶代號</th>' +
            N'<th>確 認 碼</th>' +
            N'<th>品    號</th>' +        
            N'<th>預 交 日</th></tr>' +    
        CAST ( ( SELECT td =TC001,   '',        
                        td = TC002,  '',
                        td = TC004,  '',
                        td = TC027,  '',
                        td = TD004,  '',
                        td = TD008,  '',    
                        td = TD013     
                   FROM  EPO.dbo.COPTC INNER JOIN EPO.dbo.COPTD ON COPTC.TC001=COPTD.TD001 AND COPTC.TC002=COPTD.TD002 where TC001='DSO1' AND TC027<>'V' AND TC039=CONVERT(varchar(8), GETDATE(),112)  
                   FOR XML PATH('tr'), TYPE    
        ) AS NVARCHAR(MAX) ) +   
        N'</table>' ;    
    SELECT @tableHTML


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月8日 上午 03:13
  • 對唷..SORRY

    確實沒跑出來出現@tableHML語法錯誤

    2012年5月8日 上午 03:20
  • 對唷..SORRY

    確實沒跑出來出現@tableHML語法錯誤

    或許你應該先修復這個語法錯誤。

    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月8日 上午 03:22
  • 但檢查後又沒有問題命令順利完成

    SET @tableHTNL= 這語法有需要注意哪些嗎

    我不是管SQL所以幫幫忙

    2012年5月8日 上午 03:28
  • 我在處理一下謝謝

    2012年5月8日 上午 03:33
  • TerryChuang 請教一下

    參考其他資訊

    但結果顯示:沒有資料行名稱,是我哪與法有問題嗎

    請問下方這段有問題嗎

    CAST ( ( SELECT td =TC001,   '',       
                        td
    = TC002,  '',
                        td
    = TC004,  '',
                        td
    = TC027,  '',
                        td
    = TD004,  '',
                        td
    = TD008,  '',   
                        td
    = TD013    
                  
    FROM  EPO.dbo.COPTC INNER JOIN EPO.dbo.COPTD ON COPTC.TC001=COPTD.TD001 AND COPTC.TC002=COPTD.TD002 where TC001='DSO1' AND TC027<>'V' AND TC039=CONVERT(varchar(8), GETDATE(),112) 

    2012年5月8日 上午 04:48
  • 請試試看這樣有沒有資料。

    SELECT td =TC001,   '',        
                        td = TC002,  '',
                        td = TC004,  '',
                        td = TC027,  '',
                        td = TD004,  '',
                        td = TD008,  '',    
                        td = TD013     
                   FROM  EPO.dbo.COPTC INNER JOIN EPO.dbo.COPTD ON COPTC.TC001=COPTD.TD001 AND COPTC.TC002=COPTD.TD002 where TC001='DSO1' AND TC027<>'V' AND TC039=CONVERT(varchar(8), GETDATE(),112) 


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月8日 上午 05:35
  • 查詢結果有出現欄位但顯示未指定名稱

    資料沒有,我也在思考這問題其實就是兩個資料表合併後發MAILE

    再找找,大大有時間在指導一下 

    感恩

    2012年5月8日 上午 06:17
  • 因為我沒有你的TABLE SCHEMA,所以我以Northwind資料庫來模擬你的狀況,希望對你有幫助。

    DECLARE @tableHTML  NVARCHAR(MAX) ;    
    SET @tableHTML =    
        N'<H1>Region Info</H1>' +    
        N'<table border="1">' +    
        N'<tr><th>Region ID</th>' +                  
        N'<th>Region Description</th></tr>' +   
     CAST ( ( SELECT td =RegionID,   '',        
                        td = LTRIM(RTRIM(RegionDescription))
                   FROM  Region
                   FOR XML PATH('tr'), TYPE    
        ) AS NVARCHAR(MAX) ) +   
        N'</table>' ;    
       
    EXEC msdb.dbo.sp_send_dbmail   
    @profile_name = 'ERPSQL', --sql server中dbmail的profile名稱   
    @recipients = 'abc@yahoo.com',  --收件者   
    @body = @tableHTML,  --內文的來源為變數   
    @body_format = 'HTML' ,  --設定內文格式為html   
    @subject = 'D-MAX當日客戶訂單資訊通知' ;    --主旨

    執行結果:


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月8日 上午 07:07
  • 謝謝感恩
    2012年5月8日 上午 08:25
  • 但結果顯示:沒有資料行名稱,是我哪與法有問題嗎

    請問下方這段有問題嗎

    CAST ( ( SELECT td =TC001,   '',       
                        td
    = TC002,  '',
                        td
    = TC004,  '',
                        td
    = TC027,  '',
                        td
    = TD004,  '',
                        td
    = TD008,  '',   
                        td
    = TD013    
                  
    FROM  EPO.dbo.COPTC INNER JOINEPO.dbo.COPTD ONCOPTC.TC001=COPTD.TD001 ANDCOPTC.TC002=COPTD.TD002 whereTC001='DSO1' ANDTC027<>'V' ANDTC039=CONVERT(varchar(8),GETDATE(),112) 

    您先確認 CAST 裡面的 SELECT 子句可以正確查詢出結果,再跟您原本的語法結合在一起。不然大家沒有您的資料庫可幫您除錯。

    Hooray for Technology 為技術歡呼系列 - TechNet & MSDN 論壇網友一起瘋技術,http://technet.microsoft.com/zh-tw/hh994631.aspx。6月2日高雄,6月9日台北。


    ☞ 這裡是「免費的討論區」付費支援服務請造訪 此處享受尊榮服務
    如果回覆對您有幫助,請記得按下標示為解答」

    2012年5月8日 上午 08:41
    版主
  • 超怪

    剛剛才要在看一下

    只是把原先的貼上執行準備修改

    但跑出來了都還沒修改成您建議的方式

    2012年5月8日 上午 09:20
  • 所以是已經可以了嗎?

    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月8日 上午 09:22
  • 感謝大大確實目前是可以了

    結果因該也是我的問題

    再請教,因為因該是沒有數據所以顯示空白...,

    那大大可以有辦法讓她沒有數據時顯示暫無資料等資訊嗎

    感恩

    2012年5月9日 上午 04:03
  • 多加一道判斷式

    IF (SELECT COUNT(*) FROM EPO.dbo.COPTC INNER JOIN EPO.dbo.COPTD ON COPTC.TC001=COPTD.TD001 AND COPTC.TC002=COPTD.TD002 where TC001='DSO1' AND TC027<>'V' AND TC039=CONVERT(varchar(8), GETDATE(),112))=0
    SET @tableHTML = '查無資料'
    ELSE
    SET @tableHTML =   
        N'<H1>當日客戶訂單資訊</H1>' +   
        ... +  
        N'</table>' ;   


    Hooray for Technology 為技術歡呼系列 - TechNet & MSDN 論壇網友一起瘋技術,http://technet.microsoft.com/zh-tw/hh994631.aspx。6月2日高雄,6月9日台北。


    ☞ 這裡是「免費的討論區」付費支援服務請造訪 此處享受尊榮服務
    如果回覆對您有幫助,請記得按下標示為解答」

    2012年5月9日 上午 05:48
    版主
  • 感謝大大確實目前是可以了

    結果因該也是我的問題

    再請教,因為因該是沒有數據所以顯示空白...,

    那大大可以有辦法讓她沒有數據時顯示暫無資料等資訊嗎

    感恩

    或許你可以試試看下列的作法。

    DECLARE @tableHTML  NVARCHAR(MAX) ;    
    SET @tableHTML =    
        N'<H1>Region Info</H1>' +    
        N'<table border="1">' +    
        N'<tr><th>Region ID</th>' +                  
        N'<th>Region Description</th></tr>' +   
     CAST ( (SELECT ISNULL(t.td,'<td colspan=''2''>No Data</td>')
    			  FROM 
    			  (
    			  (SELECT td =RegionID,   '',        
                        td = LTRIM(RTRIM(RegionDescription))
                   FROM  Region
    			   WHERE RegionID = 5
                   FOR XML PATH('tr'), TYPE    			
    			)) t(td))
    	AS NVARCHAR(MAX) ) +   
        N'</table>' ;    
    
    SELECT @tableHTML
    


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月9日 下午 01:17
  • 大大想在請教一下,不好意思找時間去惡補

    如下面如果整併一封MAIL資訊,但他在前段如果沒有符合資訊就無法帶出其他資訊

    如何能分段顯示,那如果又加每段的判斷是顯是無資料是否比照先前指導在前方加判斷式

    DECLARE @tableHTML NVARCHAR(MAX) ;
    SET @tableHTML =
        N'<H1>此為系統自動寄發,請勿直接回覆或轉寄。</H1>' +  
        N'<H1>本日新增材料資料</H1>' +   
        N'<table border="1">' +   
        N'<tr><th>主件品號</th>' +   
            N'<th>品    名</th>' +
            N'<th>規    格</th>' +
            N'<th>屬    性</th>' +
            N'<th>確 認 碼</th>' +
            N'<th>確認日期</th></tr>' +   
        CAST ( ( SELECT td = MC001,  '',       
                        td = MB002,  '',
                        td = MB003,  '',
                        td = MB025,  '',
                        td = MC016,  '',
                        td = MC017 
                   FROM  WAN.dbo.BOMMC INNER JOIN WAN.dbo.INVMB ON BOMMC.MC001=INVMB.MB001 where MC016='N' AND MC017=CONVERT(varchar(8), GETDATE(),112)
        FOR XML PATH('tr'), TYPE  
           ) AS NVARCHAR(MAX) )+
        N'</table>'+
        N'<H1>本日新增材料變更資訊</H1>' +   
        N'<table border="1">' +   
        N'<tr><th>變更單別</th>' +   
            N'<th>變更單號</th>' +
            N'<th>變更日期</th>' +
            N'<th>變更原因</th>' +
            N'<th>單據日期</th>' +
            N'<th>確 認 碼</th></tr>' +   
        CAST ( ( SELECT td = TA001,  '',       
                        td = TA002,  '',
                        td = TA003,  '',
                        td = TA005,  '',
                        td = TA009,  '',
                        td = TA007   
                   FROM  WAN.dbo.BOMTA INNER JOIN WAN.dbo.BOMTB ON BOMTA.TA001=BOMTB.TB001 AND BOMTA.TA002=BOMTB.TB002 where TA007='Y' AND TA009=CONVERT(varchar(8), GETDATE(),112)
                   FOR XML PATH('tr'), TYPE   
        ) AS NVARCHAR(MAX) ) +  
        N'</table>' ;
    select  @tableHTML
    EXEC msdb.dbo.sp_send_dbmail  
    @profile_name = 'ESQL',  
    @recipients='back@yahoo.com',
    @body = @tableHTML, 
    @body_format = 'HTML' ,  
    @subject = '本日材料用量資料、材料變更資訊' ;

    2012年5月16日 上午 02:12
  • 先前回覆您的方式,您嘗試過了嗎?

    IF (SELECT COUNT(*) FROM EPO.dbo.COPTC INNER JOIN EPO.dbo.COPTD ON COPTC.TC001=COPTD.TD001 AND COPTC.TC002=COPTD.TD002 where TC001='DSO1' AND TC027<>'V' AND TC039=CONVERT(varchar(8), GETDATE(),112))=0
      BEGIN
         -- 在這邊寫上,沒資料時,要顯示的內容,例如:
         SET @tableHTML = '查無資料,沒事不要找 IT 人員啊!'
      END
    ELSE
      BEGIN
        -- 在這邊寫上,有資料時,要顯示的內容,例如:

        SET @tableHTML =   
            N'<H1>當日客戶訂單資訊</H1>' +   
            ... +  
            N'</table>' ;
    END   


    Hooray for Technology 為技術歡呼系列 - TechNet & MSDN 論壇網友一起瘋技術,http://technet.microsoft.com/zh-tw/hh994631.aspx。6月2日高雄,6月9日台北。


    ☞ 這裡是「免費的討論區」付費支援服務請造訪 此處享受尊榮服務
    如果回覆對您有幫助,請記得按下標示為解答」

    2012年5月16日 下午 03:42
    版主
  • 報告先進

    有您提供的方式有呈現出來,非常感謝,有資料收到MAIL也會顯示,當查詢無資訊確實會依照IF判斷式帶出無資料訊息。

    但我在嘗試另外想在同一作業中一次查詢兩個不同類型資料,顯示兩筆資訊先用沒有判斷是否有資訊。

    上半部查詢與下半部查詢如果都有資訊收到MAIL就會查詢依條件顯示,但如果上半部查詢沒有資料下半部也就部會顯示,所以是否還要透過其他SQL指定改變。那如果上半部沒有資訊是否可以顯示當日無此資訊,下半部有資訊就顯示查詢資訊.....非常感謝大大幫忙先解決這問題 後面我也要來惡補了...

    下面是沒有先帶入判斷是否有資訊的,但有分兩塊查詢條件分別格式化HTML顯示...

    DECLARE @tableHTML NVARCHAR(MAX) ;
    SET @tableHTML =
    N'<H1>此為系統自動寄發,請勿直接回覆或轉寄。</H1>' +
    N'<H1>本日新增材料資料</H1>' +
    N'<table border="1">' +
    N'<tr><th>主件品號</th>' +
    N'<th>品 名</th>' +
    N'<th>規 格</th>' +
    N'<th>屬 性</th>' +
    N'<th>確 認 碼</th>' +
    N'<th>確認日期</th></tr>' +
    CAST ( ( SELECT td = MC001, '',
    td = MB002, '',
    td = MB003, '',
    td = MB025, '',
    td = MC016, '',
    td = MC017
    FROM WAN.dbo.BOMMC INNER JOIN WAN.dbo.INVMB ON BOMMC.MC001=INVMB.MB001 where MC016='N' AND MC017=CONVERT(varchar(8), GETDATE(),112)
    FOR XML PATH('tr'), TYPE
    ) AS NVARCHAR(MAX) )+
    N'</table>'+
    N'<H1>本日新增材料變更資訊</H1>' +
    N'<table border="1">' +
    N'<tr><th>變更單別</th>' +
    N'<th>變更單號</th>' +
    N'<th>變更日期</th>' +
    N'<th>變更原因</th>' +
    N'<th>單據日期</th>' +
    N'<th>確 認 碼</th></tr>' +
    CAST ( ( SELECT td = TA001, '',
    td = TA002, '',
    td = TA003, '',
    td = TA005, '',
    td = TA009, '',
    td = TA007
    FROM WAN.dbo.BOMTA INNER JOIN WAN.dbo.BOMTB ON BOMTA.TA001=BOMTB.TB001 AND BOMTA.TA002=BOMTB.TB002 where TA007='Y' AND TA009=CONVERT(varchar(8), GETDATE(),112)
    FOR XML PATH('tr'), TYPE
    ) AS NVARCHAR(MAX) ) +
    N'</table>' ;
    EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'ESQL',
    @recipients='back@yahoo.com',
    @body = @tableHTML,
    @body_format = 'HTML' ,
    @subject = '本日材料用量資料、材料變更資訊' ;

    2012年5月16日 下午 04:54
  •  其實用我上面提供的做法就可以達到你的需求了。

    DECLARE @tableHTML  NVARCHAR(MAX) ;    
    SET @tableHTML =    
        N'<H1>Region Info</H1>' +    
        N'<table border="1">' +    
        N'<tr><th>Region ID</th>' +                  
        N'<th>Region Description</th></tr>' +   
     CAST ( (SELECT ISNULL(t.td,'<td colspan=''2''>No Data</td>')
    			  FROM 
    			  (
    			  (SELECT td =RegionID,   '',        
                        td = LTRIM(RTRIM(RegionDescription))
                   FROM  Region
    			   WHERE RegionID = 100
                   FOR XML PATH('tr'), TYPE    			
    			)) t(td))
    	AS NVARCHAR(MAX) ) +   
        N'</table>' +
    	N'<H1>Region Info</H1>' +    
        N'<table border="1">' +    
        N'<tr><th>Region ID</th>' +                  
        N'<th>Region Description</th></tr>' +   
     CAST ( (SELECT ISNULL(t.td,'<td colspan=''2''>No Data</td>')
    			  FROM 
    			  (
    			  (SELECT td =RegionID,   '',        
                        td = LTRIM(RTRIM(RegionDescription))
                   FROM  Region
    			   WHERE RegionID = 1
                   FOR XML PATH('tr'), TYPE    			
    			)) t(td))
    	AS NVARCHAR(MAX) ) +   
        N'</table>'
    SELECT @tableHTML


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月16日 下午 10:18
  • 大大

    在此非常感謝您提供的方式與意見

    經過幾番測試改變目前OK了可以分段顯示

    太感謝了

    2012年5月17日 上午 07:44