2017-09-05 7 views
1

Débutant SSIS ici.ssis table temporaire exec proc

J'ai un package SSIS que j'ai créé en fonction de l'assistant. J'ai ajouté une tâche SQL pour exécuter le script que je courais auparavant séparément, afin de réduire le processus en une seule étape. Le script utilise beaucoup de tables temporaires, et un ## temp global à la fin pour rendre le résultat accessible en dehors du processus.

Lorsque j'essaie d'exécuter le package, j'obtiens une "erreur de validation de package" complexe (code d'erreur 0x80040E14). Je pense que la partie active du message d'erreur est "Nom d'objet invalide '## roster5". " Je viens de réaliser que c'était la tâche de flux de données qui jetait l'erreur, donc j'ai essayé de mettre une autre tâche SQL avant tout pour créer la table afin que la tâche de flux de données voit que la table est là; mais il me donne toujours l'erreur: "Nom d'objet invalide '## ROSTER_MEMBER_NEW5'."

Qu'est-ce que je manque/fais mal? Je ne sais pas ce que je ne sais pas. Il semble que cela ne devrait pas être si compliqué (En tant que débutant, je sais que c'est probablement une copie de ... quelque chose, mais je ne sais pas comment poser la question.)

+0

Il existe quelques solutions à cela. Dites-moi d'abord combien de lignes vous attendez dans ## roster5, ## roser) member_news5. – plditallo

+0

oups, ## roster5 était juste un raccourci pour le nom complet; Il y a environ 5 millions de lignes produites par le script – hmmmmm

+0

Vous verrez des suggestions pour convertir votre table #temp en une variable de table (par exemple @temptable). L'optimiseur traitera la table des variables comme une table avec une seule ligne, ce qui aura un impact sur les performances. Vous verrez également d'autres suggestions, telles que set frmt off (https://stackoverflow.com/questions/1579476/using-temp-tables-in-ssis). Cela aussi provoquera un coup de performance. Je voudrais créer une table de transfert avec un schéma identifiable, le peupler, puis quand à travers tronquer. – plditallo

Répondre

0

Basé sur votre réponses, une autre option consiste à ajouter une étape T-SQL dans un travail SQL Agent qui exécute T-SQL autonome. Vous devez repenser le contrôle de flux de votre package SSIS d'origine et le diviser en deux packages distincts. Le premier paquet SSIS exécutera tout ce qui est nécessaire avant l'étape T-SQL, l'étape suivante exécutera le T-SQL réel nécessaire pour agréger, puis la dernière étape appellera le second paquet, ce qui complètera le processus.

J'offre ce conseil avec la mise en garde qu'il n'est pas conseillé. Ce qui fonctionne le mieux est de communiquer avec votre administrateur de base de données, qui sera en mesure de vous offrir un compte de service pour exécuter votre package SSIS avec les privilèges élevés nécessaires pour tronquer la table de transfert qui devra exister pour votre processus à gérer.

0

Je veux vraiment poster une non-réponse. J'ai essayé de suivre les conseils ci-dessus aussi bien que je le pouvais, mais rien n'a fonctionné. Mon script était supposé s'exécuter, et ensuite la pompe de données était censée, essentiellement copier le contenu d'un temp global à un autre serveur/table. Je faisais cela en deux étapes, et j'ai essayé d'utiliser SSIS pour tout faire en une seule étape. Il n'y avait pas vraiment besoin de passer des valeurs dans SSIS d'un composant à l'autre. Cela ne semble pas être si difficile.

Dans tous les cas, comme je l'ai dit, rien n'a fonctionné. Ok, laissez-moi dire ce que je pense est arrivé. Après avoir fait beaucoup d'erreurs, beaucoup d'annulations, et beaucoup de tentatives infructueuses, quelque chose a commencé à fonctionner. L'une des choses que je pense est que j'ai défini ResultSetType sur ResultSetType_None, car je n'utiliserais aucun résultat de cette étape. Si quelqu'un pense que ce n'est pas ce qui s'est passé, je suis heureux d'entendre l'actualité, puisque je veux apprendre. Je considère cela comme une non-réponse, parce que j'ai peu confiance que j'ai raison, ou que je l'ai eu par n'importe quoi d'autre qu'un accident.