iT邦幫忙

0

msdb.dbo.sp_send_dbmail 檔案轉UTF-8

  • 分享至 

  • xImage

declare @column1name varchar(50)
declare @qry varchar(max)
declare @mail_subject varchar(50)
select @qry='SET NOCOUNT ON;print ''sep=;''; select brand_type '+
' ,shop_name,acc_area,pay_tx_trade_no,pos_trade_time,trade_type,amount,trade_fee
FROM ##report_temp'
select @mail_subject=@queryYM+'明細表'
exec msdb.dbo.sp_send_dbmail
@profile_name = 'XXXXXX_db',
@recipients = @mailto ,
@copy_recipients = 'XXXXX@8way.com.tw',
@query= @qry,
@attach_query_result_as_file = 1,
@query_result_width =32767,
@query_result_no_padding=1 ,
@query_attachment_filename = 'Report.xls',
@query_result_header = 1,
@subject = @mail_subject,
@query_result_separator = ';',
@ansi_attachment = 1 --msdb.dbo.sp_send_dbmail在SQL Server 2008R2預設不是ANSI輸出有在該程序調整
drop table ##report_temp
END

想請教各位,要執行預存程序後轉成csv檔,但因為表格有中文所以多加一個語法叫做 @ansi_attachment = 1 ,但現在執行預存程序後會跳錯誤,錯誤訊息如圖

請問該怎麼修正語法可以讓中文欄位與中文的值正常顯示呢?
上網查 = 1 是UTF-8 但又無法執行!

https://ithelp.ithome.com.tw/upload/images/20230707/20153182OICDbdYGoa.jpg

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
rogeryao
iT邦超人 8 級 ‧ 2023-07-07 14:01:37
  1. varchar => Nvarchar
  2. '明細表' =>N'明細表'
看更多先前的回應...收起先前的回應...
j26281638 iT邦新手 5 級 ‧ 2023-07-07 14:05:39 檢舉

跳出
作業失敗。 作業由 使用者 sa 叫用。要執行的最後一個步驟是步驟 1 (step1)。.

rogeryao iT邦超人 8 級 ‧ 2023-07-07 14:18:06 檢舉

@ansi_attachment = 1 <== 去除

j26281638 iT邦新手 5 級 ‧ 2023-07-07 14:53:38 檢舉

CREATE TABLE ##report_temp
(
[門店名稱] NVARCHAR(10) 

剛剛欄位名稱中文命名
但是檔案打開來還是沒有顯示完整
https://ithelp.ithome.com.tw/upload/images/20230707/20153182GVY63KXmcj.png

j26281638 iT邦新手 5 級 ‧ 2023-07-07 14:55:22 檢舉

CREATE TABLE ##report_temp
(
[門店名稱] NVARCHAR(10) ,
[shop_name] NVARCHAR(30),
[acc_area] NVARCHAR(30),
[pay_tx_trade_no] NVARCHAR(30),
[pos_trade_time] NVARCHAR(30),
[trade_type] NVARCHAR(5),
[amount] float,
[trade_fee] float
)
insert into ##report_temp
exec [XXXX].[dbo].[XXXXX] @queryYM

declare @column1name Nvarchar(50)
declare @qry Nvarchar(max)
declare @mail_subject Nvarchar(50)

select @qry='SET NOCOUNT ON;print ''sep=;''; select [門店名稱] '+
' ,shop_name,acc_area,pay_tx_trade_no,pos_trade_time,trade_type,amount,trade_fee
FROM ##report_temp'
select @mail_subject=@queryYM+N'明細表'

rogeryao iT邦超人 8 級 ‧ 2023-07-07 16:18:57 檢舉

建議 :
1.下一道 SQL 產生中文欄位
declare @column1name varchar(50)
@column1name = N'門店名稱'+ N'店長'.....
2.資料的部分獨立下一條 SQL

0
Gary
iT邦好手 1 級 ‧ 2023-07-07 14:16:55

GPT根據提供的程式碼和問題描述,可以嘗試進行以下修改以解決中文欄位和值無法正常顯示的問題。

將 @ansi_attachment 設為 0
因為您想要中文欄位和值正常顯示,所以我們需要將 @ansi_attachment 設為 0,表示使用Unicode編碼(UTF-16)來處理附件。這樣可以確保中文字符被正確地編碼和顯示。

修改程式碼如下:
@ansi_attachment = 0
修改 @qry 中的 print 'sep=;' 語句
您在 @qry 中使用了 print 'sep=;' 語句,這會導致生成的 CSV 檔案的第一行包含 'sep=;',這不是正確的 CSV 標頭。為了避免這個問題,我們可以刪除這個語句。

修改程式碼如下:
select @qry='SET NOCOUNT ON; select brand_type '+
' ,shop_name,acc_area,pay_tx_trade_no,pos_trade_time,trade_type,amount,trade_fee FROM ##report_temp'
確保郵件的主旨 @mail_subject 正確設定
您的程式碼中使用了 @mail_subject=@queryYM+'明細表' 來設定郵件的主旨,但是在程式碼中沒有看到 @queryYM 的定義。請確保這個變數被正確地定義並賦值。

修改程式碼如下:
declare @queryYM varchar(50)
select @queryYM = '報告日期' -- 修改為適當的值
select @mail_subject = @queryYM + '明細表'
請根據上述修改嘗試運行您的程式碼,這樣應該能夠正確地生成中文欄位和值的 CSV 檔案並傳送郵件。

我要發表回答

立即登入回答