web-dev-qa-db-ja.com

SSISパッケージを使用して、電子メール本文のテーブルからレコードを送信する方法

Productというテーブルが1つあります。

製品テーブルにはより多くのレコードがありますが、テーブルにレコードがない場合があります。

だから私は製品テーブルをチェックしたいのですが、

if it's have the records i send all table information as mail.

if it's not have record no need to send mail.

私を助けてください。

12
kanth

可能なオプションの1つを次に示します。次の例は、Send Email taskを使用して結果セットを電子メールで送信する方法を示しています。この例では、クエリ結果セットをループしてメッセージ本文を形成し、Send Email taskを使用してメールで送信する方法を示します。

結果セットが空白のときに電子メールを送信したくない場合は、ExpressionLoop resultsetの間の優先順位制約に追加できます。メールを送信タスク。

この例では、SSIS 2008 R2およびSQL Server 2008 R2データベースを使用しています。

段階的なプロセス:

  1. SQL Scriptsセクションにあるスクリプトを使用して、dbo.EmailDataという名前のテーブルを作成します。

  2. スクリーンショット#1は、この例のExecute SQLタスクがクエリして電子メールで送信するサンプルデータを示しています。

  3. SSISパッケージで、スクリーンショット#2に示すように、5変数を作成します。

  4. SSISパッケージで、次のタスクを配置します:Execute SQL taskForeach loop containerScript taskForeachループコンテナー内およびSend Email task

  5. スクリーンショット#3および#4に示すように、Execute SQL taskを構成します。

  6. スクリーンショット#5および#6に示すように、Foreach loop containerを構成します。変数マッピングセクションには、クエリ結果列が表示される順序と、それらがSSIS変数に割り当てられる方法が表示されます。これらの変数は、Script task内の電子メールメッセージを形成するために使用されます。

  7. Script taskで、コードをScript task codeセクションの下に表示されているコードに置き換えます。スクリプトタスクには、非常に単純なプレーンテキストの電子メールメッセージの形式があります。

  8. スクリーンショット#7に示すように、メール送信タスクを設定します。FromおよびToフィールドに有効なメールアドレスを設定する必要があります。

  9. 制御フロータスクを構成すると、パッケージはスクリーンショット#8のようになります。

  10. サンプルパッケージの実行は、スクリーンショット#9に示されています。

  11. パッケージによって送信された電子メールは、スクリーンショット#10に示されています。スクリーンショットから一部の情報を削除しました。スクリーンショット#1に示されているテーブルデータをこのメール出力と比較できます。これらは同じである必要があります。

お役に立てば幸いです。

SQLスクリプト:

CREATE TABLE [dbo].[EmailData](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemId] [varchar](255) NOT NULL,
    [ItemName] [varchar](255) NOT NULL,
    [ItemType] [varchar](255) NOT NULL,
    [IsProcessed] [bit] NULL,
 CONSTRAINT [PK_EmailData] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

スクリプトタスクコード:

C#SSIS 2008 and aboveでのみ使用できるコード。 。

/*Microsoft SQL Server Integration Services Script Task
   Write scripts using Microsoft Visual C# 2008.
   The ScriptMain is the entry point class of the script.
*/

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;

namespace ST_7f59d09774914001b60a99a90809d5c5.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

        public void Main()
        {
            Variables varCollection = null;
            string header = string.Empty;
            string message = string.Empty;

            Dts.VariableDispenser.LockForWrite("User::EmailMessage");
            Dts.VariableDispenser.LockForWrite("User::ItemId");
            Dts.VariableDispenser.LockForWrite("User::ItemName");
            Dts.VariableDispenser.LockForWrite("User::ItemType");
            Dts.VariableDispenser.GetVariables(ref varCollection);

            //Set the header message for the query result
            if (varCollection["User::EmailMessage"].Value == string.Empty)
            {
                header = "Execute SQL task output sent using Send Email Task in SSIS:\n\n";
                header += string.Format("{0}\t{1}\t\t\t{2}\n", "Item number", "Item name", "Item type");
                varCollection["User::EmailMessage"].Value = header;
            }

            //Format the query result with tab delimiters
            message = string.Format("{0}\t{1}\t{2}",
                                        varCollection["User::ItemId"].Value,
                                        varCollection["User::ItemName"].Value,
                                        varCollection["User::ItemType"].Value);

            varCollection["User::EmailMessage"].Value = varCollection["User::EmailMessage"].Value + message;

            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

スクリーンショット#1:

1

スクリーンショット#2:

2

スクリーンショット#3:

3

スクリーンショット#4:

4

スクリーンショット#5:

5

スクリーンショット#6:

6

スクリーンショット#7:

7

スクリーンショット#8:

8

スクリーンショット#9:

9

スクリーンショット#10:

10

59
user756519

別のアプローチを適用できます。SSISからSQLデータベースタスクを実行して実行するだけですSP "SSISステップを実行したい場合のみ"(または、SPを作成してジョブでスケジュールするだけです) SP内部でメールを送信できます。場合、メールプロファイルの設定方法がわからない場合は、これを参照してください( https://www.codeproject.com/Articles/485124/Configuring-Database-Mail-in-SQL-Server )

以下の例-

CREATE TABLE #Temp 
( 
  [Rank]  [int],
  [Player Name]  [varchar](128),
  [Ranking Points] [int],
  [Country]  [varchar](128)
)


INSERT INTO #Temp
SELECT 1,'Manoj Kargeti',12390,'India'
UNION ALL
SELECT 2,'Vimal Kumar',7965,'Nepal'
UNION ALL
SELECT 3,'Pappu Djokovic',7880,'ShriLanka'


DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)


SET @xml = CAST(( SELECT [Rank] AS 'td','',[Player Name] AS 'td','',
       [Ranking Points] AS 'td','', Country AS 'td'
FROM  #Temp ORDER BY Rank 
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))


SET @body ='<html><body><H3>Tennis Rankings Info</H3>
<table border = 1> 
<tr>
<th> Rank </th> <th> Player Name </th> <th> Ranking Points </th> <th> Country </th></tr>'    


SET @body = @body + @xml +'</table></body></html>'


EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQL ALERTING', -- replace with your SQL Database Mail Profile 
@body = @body,
@body_format ='HTML',
@recipients = '[email protected]', -- replace with your email address
@subject = 'E-mail in Tabular Format' ;


DROP TABLE #Temp
1
Manoj Kargeti