Verwenden von Temp-Tabellen in SSIS

7

Ich verwende eine temporäre Tabelle in Stored Procedure in SQL Server. Ich versuche, diesen SP im OLE DB-Quelltext-Editor zu verwenden.

Ich kann die Datenausgabe im Abfrage-Generator sehen, der mit der Schaltfläche Abfrage erstellen angezeigt wird. Aber wenn ich auf die Registerkarte Spalten klicke, erhalte ich den folgenden Fehler.

  

- TITEL: Microsoft Visual Studio

     

Fehler bei Datenfluss-Task [OLE DB-Quelle [1]]: SSIS-Fehlercode   DTS_E_OLEDBERROR. Ein OLE DB-Fehler ist aufgetreten. Fehlercode:   0x80004005. Ein OLE DB-Datensatz ist verfügbar. Quelle: "Microsoft SQL   Server Native Client 10.0 "Hresult: 0x80004005 Beschreibung:" Ungültig   Objektname '## Payment'. ".

     

Fehler beim Datenfluss-Task [OLE DB-Quelle [1]]: Die Spalte konnte nicht abgerufen werden   Informationen aus der Datenquelle. Stellen Sie sicher, dass Ihre Zieltabelle in der   Datenbank ist verfügbar.

Bedeutet das, dass ich temporäre Tabellen in SP nicht verwenden kann, wenn ich möchte, dass sie von SSIS konsumiert werden

    
Jason M 16.10.2009, 17:54
quelle

7 Antworten

8

Ich habe

benutzt

SET FMTONLY AUS zu Beginn der Prozedur, die besagt, dass keine Zeilen an den Client zu verarbeiten sind wenn es nicht ausgeführt wird Da es beim Parsen des SP keine temporäre Tabelle gibt, ist beim Analysieren keine Spalte verfügbar.

Es hat mich endlich arbeiten lassen:)

    
Jason M 16.10.2009, 19:54
quelle
15

Es gibt eine andere Lösung, die unter Ссылка erwähnt wird. Schau dir Option 3 an.

Quote: Fügen Sie der gespeicherten Prozedur einige Meta-Daten und "nocount on" mit einer "short circuited if-Klausel" (wenn 1 = 0) und einer falschen Auswahlanweisung am Anfang hinzu. Ich habe getestet mit dem Versuch, die "nocount on" zu verlassen und es hat nicht funktioniert.

%Vor%     
Henrik Staun Poulsen 22.02.2011 10:10
quelle
5

Wenn der Fehler aufgetreten ist, während Sie sich in BIDS befinden, funktioniert die Lösung von ajdams nicht, da sie nur für Fehler gilt, die beim Ausführen des Pakets vom SQL Server-Agent ausgelöst werden.

Das Hauptproblem ist, dass SSIS Schwierigkeiten hat, die Metadaten aufzulösen. Von ihrem Standpunkt aus existieren die ## Tabellen nicht, da sie die Metadaten für das Objekt während der Vorausführungsphase nicht zurückgeben können. Sie müssen also einen Weg finden, die Anforderung zu erfüllen, dass die Tabelle bereits existiert. Es gibt ein paar Lösungen:

  1. Verwenden Sie keine temporären Tabellen. Erstellen Sie stattdessen eine funktionierende Datenbank und legen Sie alle Ihre Objekte darin ab. Offensichtlich wird dies wahrscheinlich nicht funktionieren, wenn Sie versuchen, die Daten auf einem Server zu erhalten, auf dem Sie kein dbo wie ein Produktionsserver sind, so dass Sie sich nicht auf diese Lösung verlassen können.

  2. Verwenden Sie CTEs anstelle von temporären Tabellen. Dies funktioniert, wenn Ihr Quellserver 2005/2008 ist. Dies hilft nicht, wenn der Quellserver 2000 ist.

  3. Erstellen Sie die Tabelle ## in einem separaten Befehl SQL ausführen. Legen Sie die RetainSameConnection-Eigenschaft der Verbindung auf True fest. Setzen Sie DelayValidation für den Datenfluss auf true. Wenn Sie den Datenfluss einrichten, fälschen Sie ihn aus, indem Sie vorübergehend ein SELECT TOP 0-Feld = CAST (NULL AS INT) an den Anfang der gespeicherten Prozedur mit identischen Metadaten für Ihre endgültige Ausgabe hinzufügen. Denken Sie daran, dieses aus der gespeicherten Prozedur zu entfernen, bevor Sie das Paket ausführen. Dies ist auch ein praktischer Trick, um temporäre Tabellendaten zwischen Datenflüssen zu teilen. Wenn der Rest des Pakets separate Verbindungen verwenden soll, damit sie parallel ausgeführt werden können, müssen Sie eine zusätzliche nicht gemeinsam genutzte Verbindung erstellen. Dies vermeidet das Problem, da die temporäre Tabelle bereits zu dem Zeitpunkt existiert, zu dem die Datenfluss-Tasks ausgeführt werden.

Option 3 erreicht Ihr Ziel, aber es ist kompliziert und hat die Einschränkung, dass Sie den Befehl create ## in einen anderen Aufruf einer gespeicherten Prozedur trennen müssen. Wenn Sie gespeicherte Prozeduren auf dem Quellserver erstellen können, haben Sie wahrscheinlich auch die Möglichkeit, andere Objekte wie Zwischenspeichertabellen zu erstellen. Dies ist normalerweise eine bessere Lösung. Es ermöglicht auch Side-Steps TempDB-Streitfragen, was ebenfalls ein wünschenswerter Vorteil ist.

Viel Glück und lassen Sie es mich wissen, wenn Sie weitere Anleitungen zur Implementierung von Schritt 3 benötigen.

    
Registered User 16.10.2009 23:41
quelle
2

Nein, es ist ein Berechtigungsproblem. Dies sollte Ihnen helfen:

Ссылка

    
ajdams 16.10.2009 18:06
quelle
1

Bei all dem Aufwand, denke ich, ist es wahrscheinlich einfach nicht wert. Erstellen Sie eine reale Tabelle in der Datenbank und schneiden Sie sie vor / nach dem Laden ab. Wenn es für ein Datawarehouse ist, spielt es keine Rolle, ob Sie eine oder zwei zusätzliche Tabellen haben. Dies gibt Ihnen die Entwurfszeit-SSIS-Tools und bedeutet, dass Sie sich nicht um die Intracies von temporären Tabellen kümmern müssen.

Wenn Sie die Dinge getrennt halten möchten, erstellen Sie einfach Ihre SSIS-Tabellen in einem separaten Schema. Sie können Berechtigungen verwenden, um diese Schmema für alle anderen Benutzer unsichtbar zu machen.

%Vor%     
AndyM 17.02.2010 14:45
quelle
1

Diese Schritte haben mir geholfen:

  1. Schreiben Sie das endgültige Ergebnis in eine Tabelle.
  2. Schreiben Sie diese Tabelle als CREATE in ein neues Fenster des neuen Abfrageeditors.
  3. Entfernen Sie alles außer den offenen und schließenden Klammern, die die Spalten definieren.
  4. Wickeln Sie das in ein anderes Paar Klammern.
  5. Stellen Sie den Aufruf Ihres SPs von

    wieder her

    exec p_MySPWithTempTables?,?

in

%Vor%     
Irawan Soetomo 09.10.2015 19:19
quelle
0

Sie können Tabellenvariablen anstelle von temporären Tabellen verwenden. es wird funktionieren

    
paranjai 22.10.2009 12:38
quelle