Question

Permettez-moi de cette préface à dire que je suis encore un débutant en matière de SSIS. Je suis en train de remplacer un processus actuel de MS Access qui a 13 requêtes qui sont créées dans Excel et envoyé par courriel à une liste d'utilisateurs.

besoins de paquet Mon SSIS pour obtenir le nom du rapport, envoyez un courriel liste dist, les données du rapport, créez un fichier csv puis envoyez un courriel pour chacun.

Je l'ai créé le suivant dans SQL Server:

  1. une table avec les rapports - chacun a un reportId
  2. une table avec les adresses e-mail des utilisateurs
  3. une table de jointure qui relie l'utilisateur à chaque rapport
  4. créé un proc stocké quand je passe dans la reportId et renvoie la liste E-mail Dist ainsi que certains détails du rapport pour une utilisation lors de l'envoi mes e-mails
  5. créé un proc stocké que je passe le reportId à. En retour, je vais obtenir l'une des valeurs de ce rapport. Chaque rapport a une autre requête qui renvoie les différentes colonnes de données.

J'ai aussi essayé de créer un package SSIS qui effectue les opérations suivantes:

  1. à l'aide d'un Execute SQL Task obtenir la liste du rapport actif Ids
  2. un ensemble de Foreach Container Loop à ADO Enumerator à boucle à travers chaque rapport Id
  3. un Execute SQL Task qui renverra les détails de mon rapport et la liste email dist pour chaque identifiant de rapport.

Alors j'ai essayé de placer un intérieur de Data Flow Task de ma boucle et d'exécuter mon proc stocké pour retourner les données du rapport pour chaque identifiant de rapport, mais je reçois un message d'erreur:

Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. 
Error code: 0x80040E55. An OLE DB record is available.  
Source: "Microsoft SQL Server Native Client 10.0"  Hresult: 0x80040E55  Description: "Column does not exist.". 

Je devine que cette erreur est parce que mes colonnes ne sont pas les mêmes sur chaque rapport. Si tel est le cas, avez-vous des suggestions sur la façon de procéder?

Que dois-je utiliser dans mon paquet de SSIS passer par chaque rapport? Ai-je besoin de créer un package SSIS séparé pour exécuter chaque rapport?

Si je peux exécuter ce dans un seul paquet, dois-je créer un gestionnaire de connexions de fichiers plats pour chacun de mes rapports csv que je générons?

Était-ce utile?

La solution

Je pense que votre approche est saine, il vous suffit de faire quelque chose de différent à l'étape 3. Je pense que sp_send_dbmail pourrait être une option (appeler via tâche d'exécution SQL).

Vous pouvez assigner votre requête n ° 6 au paramètre @query (@query = « EXECUTE dbo.MakeReport @ ReportID = 10' ) et @ attach_query_result_as_file = 1 et, en supposant que vous avez activé le courrier de base de données, il envoie une courrier électronique aux destinataires avec les résultats de votre requête au format CSV.

Utiliser des expressions pour définir l'à, cc, et bcc sur la base des résultats de votre première requête et le tour est joué, le spam-o-matic.

Autres conseils

Si vos rapports ont des colonnes différentes, vous aurez besoin d'un flux de données différentes pour chacun d'eux. Si vous voulez toujours les faire dans la même boucle Foreach, vous pouvez essayer de faire quelque chose comme ayant une variable comme « ReportType » qui est rempli lorsque vous exécutez le Execute SQL Task. Après cela, vous pouvez diriger le flux là pour le flux de données correctes. L'image suivante montre un exemple de flux conditionnel: flux de données sous condition

Dans ce tutoriel, mais ayant un objectif différent, l'auteur décrit comment créer un flux conditionnel: http://www.simple-talk.com/sql/ssis/xml-configuration-files-in-sql-server-integration-services/

Vous trouverez plus d'informations sur les variables: http : //sqlfool.com/2009/08/getting-started-with-variables-in-ssis/

Malheureusement, SSIS exige que les métadonnées des données pipeline flux être réglé au moment de la conception, donc si vous allez utiliser une tâche de flux de données, alors vous aurez besoin d'une tâche distincte pour chaque rapport.

Vous pouvez vous déplacer avoir besoin d'une tâche de flux de données séparé et gestionnaire de connexion fichier pour chaque rapport de ne pas utiliser un flux de données. Au lieu de cela, vous pouvez utiliser BCP (en vrac programme de copie) pour copier des données dans le fichier sans avoir besoin de prédéfinir les métadonnées. BCP prendra votre jeu de résultats de la procédure stockée et juste le jeter sur le fichier. Dustin Ryan a un grand article sur la façon de faire sur BIDN. Il y a certains cas où le recours BCP SSIS peut être le meilleur choix sur une tâche de flux de données si aucune transformation sont nécessaires, ce qui est l'une de ces fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top