SQL Serverのsp_send_dbmail
での添付ファイルのエンコーディング変更方法
SQL Serverを通じて添付ファイル付きのメールを送信することは、簡単な作業のように思えます。しかし、添付ファイルがUCS-2エンコードで送信され、ANSIまたはUTF-8エンコードにしたい場合、あなたは一人ではありません。多くのユーザーが同様の問題に直面しており、特にSQL Server 2005のsp_send_dbmail
ストアドプロシージャを使用する際にこの問題が顕著です。このブログポストでは、問題について説明し、添付ファイルが正しくエンコードされることを保証するための解決策を提供します。
問題
sp_send_dbmail
機能を使用してSQLクエリの結果を添付ファイルとして送信する際に、結果がUCS-2形式でエンコードされることがあります。この形式は、ANSIまたはUTF-8形式を期待しているさまざまなアプリケーションと互換性がないため、受信者にとって問題となる可能性があります。
例のシナリオ
あなたのシナリオでは、sp_send_dbmail
で実行するクエリは以下の通りです:
EXEC msdb.dbo.sp_send_dbmail
@recipients = 'temp@example.com',
@query = 'DECLARE @string_to_trim varchar(60);SET @string_to_trim = ''1234''; select rtrim(@string_to_trim), ''tom''',
@query_result_header=0,
@subject = 'see attach',
@body= 'temp body',
@profile_name= N'wksql01tAdmin',
@body_format = 'HTML',
@query_result_separator = ',',
@query_attachment_filename = 'results.csv',
@query_no_truncate = '0',
@attach_query_result_as_file = 1
見られた問題
上記のSQLコードを実装しても、結果は依然としてUCS-2でエンコードされており、SQL Server 2005 SP2で修正が利用可能であるとのコメントもありましたが、あなたの状況ではそうではないようです。
解決策
sp_send_dbmail
を通じて直接エンコーディングを変更するオプションは限られているかもしれませんが、**BCP(Bulk Copy Program)**ユーティリティを使用することでこの問題を回避できます。
正しいエンコーディングのためのBCPの使用
-
データをフラットファイルにエクスポート: BCPを使用して、クエリの結果をフラットファイルにエクスポートします。BCPでは、エクスポートプロセス中にエンコーディング形式を指定することができます。
bcp "SELECT RTRIM(@string_to_trim), 'tom'" queryout "C:\path\to\results.csv" -c -C 65001 -T
-c
オプションはキャラクターモードを示します。-C 65001
オプションはUTF-8エンコーディングを指定します。-T
オプションはSQL Serverへの信頼された接続を使用します。
-
フラットファイルを添付: 必要なエンコーディングでファイルが生成されたら、そのファイルを従来の方法でメールに添付できます。これはスクリプトを通じて、またはSQL Serverエージェントのジョブを使用してBCPコマンドを実行し、その後にsp_send_dbmailでメールを送信することで管理できます。
手順のまとめ
- BCPコマンドを実行して、UTF-8エンコーディングの.csvファイルにクエリ結果をダンプします。
sp_send_dbmail
を使用して.csv添付ファイル付きのメールを送信します。
結論
最初は daunting に思えるかもしれませんが、sp_send_dbmail
の添付ファイルのUCS-2エンコーディングの問題はBCPを使用することで解決可能です。上記の手順に従うことで、添付ファイルが正しくエンコードされ、受信者が提供された情報にアクセスしやすくなります。
まだ問題がある場合や質問がある場合は、お気軽にお問い合わせください!