2010-12-02 47 views
6

Tengo un conjunto de resultados de una consulta Execute SQL Task guardada en una variable System.Object y me gustaría enviar estos resultados utilizando un Send Mail Task usando la siguiente expresión en el MessageSource.¿Cómo envío el conjunto de resultados de una consulta como un archivo adjunto en un correo electrónico utilizando SSIS?

"Se adjunta resumen de datos \ n \ n" + SUBSECUENCIA (@ [User :: myVariable], 1,3990)
+ "\ n \ n"

+2

¿cuál es la pregunta real? – CodeMonkey1313

Respuesta

16

Probablemente, usted ha encontrado una respuesta a su pregunta por ahora. Esta respuesta es para otros que puedan tropezar con esta pregunta. No creo que puedas usar la variable de objeto en la expresión. Debe recorrer el objeto de resultado de la consulta y formatearlo en una cadena para poder enviar el resultado de la consulta en un mensaje de correo electrónico. También puede exportar los datos a un archivo y enviar el archivo como un archivo adjunto. Esa es otra opción posible. Este ejemplo muestra cómo recorrer el conjunto de resultados de la consulta para formar el cuerpo del mensaje que luego se enviará por correo electrónico utilizando la tarea Enviar correo electrónico.

paso a paso del proceso:

  1. cree una tabla llamada dbo.EmailData usando el guión previsto en secuencias de comandos SQL sección.

  2. Captura de pantalla # 1 muestra datos de la muestra que Execute SQL tarea de consulta y enviarla en un correo electrónico en este ejemplo.

  3. En el paquete SSIS, crear variables como se muestra en la pantalla # 2 .

  4. En el paquete SSIS, colocar las siguientes tareas: Execute SQL task, Foreach loop container, Script task dentro del contenedor bucle foreach y Send Email task.

  5. Configurar el Execute SQL task como se muestra en las capturas de pantalla # y # .

  6. Configurar el Foreach loop container como se muestra en las capturas de pantalla # y # . La sección de correlaciones de variables muestra el orden en que aparecen las columnas de resultados de la consulta y cómo se asignan a las variables de SSIS. Estas variables se usarán para formar el mensaje de correo electrónico dentro del Script task.

  7. En el Script task, reemplace el código con el que se muestra debajo de la sección deescritura de código tarea. La tarea de script tiene un formato de mensaje de correo electrónico de texto plano muy simple.

  8. Configure la tarea Enviar correo electrónico como se muestra en la captura de pantalla # . Debe configurarlo con una dirección de correo electrónico válida en Desde y hasta campos.

  9. Después de configurar las tareas de flujo de control, su paquete debe verse como se muestra en la captura de pantalla # .

  10. La ejecución del paquete de muestra se muestra en la captura de pantalla # .

  11. correo electrónico enviado por el paquete se muestra en la pantalla # 10 . Se eliminó parte de la información de la captura de pantalla. Puede comparar los datos de la tabla que se muestran en la captura de pantalla # con esta salida de correo electrónico y deben ser iguales.

Espero que ayude.

Scripts 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 

escritura de código tarea:

C# código que puede ser utilizado sólo en 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; 
     } 
    } 
} 

Captura de pantalla # 1:

1

Captura de pantalla # 2:

2

Captura de pantalla # 3:

3

Captura de pantalla # 4:

4

Captura de pantalla # 5:

5

Scre enshot # 6:

6

Captura de pantalla # 7:

7

Captura de pantalla # 8:

8

Captura de pantalla # 9:

9

Captura de pantalla # 10:

10

+0

Hombre, eres tan amable. Gracias. –

1

Después de muchos intentos este método funciona realmente. Sin embargo, si tiene Visual Studio 2010 o superior, la secuencia de comandos de C# debe cambiarse muy ligeramente.

Reemplazar:

[System.AddIn.AddIn ("ScriptMain", versión = "1.0", Editorial = "", Descripción = "")]

con esto:

[ Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]

Todavía estoy tratando de resolver el espaciado en el correo electrónico que estoy recibiendo, pero estoy muy contento con los resultados.

Cuestiones relacionadas