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の使用

  1. データをフラットファイルにエクスポート: 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への信頼された接続を使用します。
  2. フラットファイルを添付: 必要なエンコーディングでファイルが生成されたら、そのファイルを従来の方法でメールに添付できます。これはスクリプトを通じて、またはSQL Serverエージェントのジョブを使用してBCPコマンドを実行し、その後にsp_send_dbmailでメールを送信することで管理できます。

手順のまとめ

  • BCPコマンドを実行して、UTF-8エンコーディングの.csvファイルにクエリ結果をダンプします。
  • sp_send_dbmailを使用して.csv添付ファイル付きのメールを送信します。

結論

最初は daunting に思えるかもしれませんが、sp_send_dbmailの添付ファイルのUCS-2エンコーディングの問題はBCPを使用することで解決可能です。上記の手順に従うことで、添付ファイルが正しくエンコードされ、受信者が提供された情報にアクセスしやすくなります。

まだ問題がある場合や質問がある場合は、お気軽にお問い合わせください!