Как отправить записи из таблицы в теле письма с использованием пакета служб SSIS? - PullRequest
10 голосов
/ 22 июня 2011

У меня есть одна таблица с именем Product.

В таблице товаров есть больше записей. Иногда в таблице нет записей.

Итак, я хочу проверить таблицу продуктов,

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

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

Пожалуйста, помогите мне.

Ответы [ 2 ]

56 голосов
/ 22 июня 2011

Вот один из возможных вариантов.Следующий пример может дать вам представление о том, как вы можете отправить по электронной почте набор результатов, используя Send Email task.В этом примере показано, как перебрать набор результатов запроса, чтобы сформировать тело сообщения, которое затем будет отправлено по электронной почте с использованием Send Email task.

Если вы не хотите отправлять электронную почту, когда набор результатов пуст, вы можете добавить Expression к ограничению приоритета между Loop resultset и Отправка электронной почты задач.

В примере используются базы данных служб SSIS 2008 R2 и SQL Server 2008 R2.

Пошаговый процесс:

  1. Создайте таблицу с именем dbo.EmailData, используя скрипт из раздела Сценарии SQL .

  2. Снимок экрана # 1 показывает примерданные, которые задача Execute SQL будет запрашивать и отправлять по электронной почте в этом примере.

  3. В пакете служб SSIS создайте 5 переменных, как показано на скриншоте# 2 .

  4. В пакете служб SSIS поместите следующие задачи: Execute SQL task, Foreach loop container, Script task в контейнере цикла Foreach и Send Email task.

  5. Сконфигурируйте Execute SQL task, как показано на скриншотах # 3 и # 4 .

  6. Настройте Foreach loop container, как показано на рисункеn скриншотов # 5 и # 6 .В разделе «Сопоставление переменных» показан порядок, в котором отображаются столбцы результатов запроса и как они назначаются переменным служб SSIS.Эти переменные будут использоваться для формирования сообщения электронной почты внутри Script task.

  7. . В Script task замените код на код, показанный под кодом задачи Script раздел.Задача сценария имеет очень простое форматирование сообщений электронной почты в виде простого текста.

  8. Настройте задачу отправки электронной почты, как показано на снимке экрана # 7 .Необходимо настроить его с действительным адресом электронной почты в полях Из и До .

  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

1 голос
/ 20 июня 2017

Вы можете применить другой подход. Просто выполните задачу базы данных SQL из SSIS для выполнения 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 = 'bruhaspathy@hotmail.com', -- replace with your email address
@subject = 'E-mail in Tabular Format' ;


DROP TABLE #Temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...