2017-04-10 3 views
0

Ich weiß, dass dies wie eine häufig gestellte Frage scheint, aber ich habe eine einzigartige Situation, auf die ich keine Antwort finden kann.SSIS OLE DB Befehl Metadatenfehler wegen DB-Auslöser

Ich habe ein einfaches SSIS-Paket, das ich verwenden möchte, um eine Tabelle aus einer Excel-Tabelle zu aktualisieren. Ich mache das mit einer OLE DB-Befehlsaufgabe, die eine gespeicherte Prozedur ausführt. Es werden jedoch keine Spaltennamen abgerufen, die zugeordnet werden müssen. Der Fehler ähnelt dem:

Die Metadaten konnten nicht ermittelt werden, da die Anweisung 'in #TempTable einfügen ...' eine temporäre Tabelle verwendet. '

Ich verstehe, warum es diesen Fehler zurückgibt, und die typischen Problemumgehungen kennen. Der Fehler stammt jedoch nicht von der gespeicherten Prozedur, die das Paket aufruft. Dieser Proc verwendet keine temporären Tabellen. Es ist ein Ergebnis des Updates, das einen Datenbank-Trigger abfeuert, der einen anderen Prozess aufruft, der temporäre Tabellen verwendet.

Leider ist der ausgelöste Prozess, der den Fehler verursacht, von der Drittanbieteranwendung, für die ich entwickle, und kann nicht geändert werden.

Kennt jemand eine Lösung, die das Hinzufügen von Code zu dem fehlerhaften Proc nicht beinhaltet?

Danke!

Antwort

1

Option 1, Excel-Tabelle in eine Zwischenspeichertabelle laden, dann 'SQL-Task ausführen' verwenden, um Ihre Final Table zu aktualisieren. Option 2, erstellen Sie eine Skriptaufgabe, lesen Sie aus der Tabelle und aktualisieren Sie Ihre finale Tabelle und vermeiden Sie so den Datenfluss für die Spaltenzuordnung.

1

Die beste Möglichkeit wäre, die Aktualisierungen in einer dedizierten Tabelle (stattdessen OLE DB-Destination) zu implementieren und dann eine SQL-Task ausführen als Nachfolgeereignis.

Legen Sie in der Task SQL ausführen einen Cursor fest, um die Staging-Tabelle zu shredden, und rufen Sie dann Ihre gespeicherte Prozedur auf.

DECLARE CSR CURSOR 
READ_ONLY 
FOR SELECT Col1, Col2 
FROM staging; 

DECLARE @Col1 nvarchar(100) 
, @Col2 nvarchar(100); 
OPEN CSR; 

FETCH NEXT FROM CSR INTO @Col1, @Col2; 
WHILE (@@fetch_status <> -1) 
BEGIN 
    IF (@@fetch_status <> -2) 
    BEGIN 
     EXECUTE dbo.MyProcedure @Col1, @Col2; 
    END 
    FETCH NEXT FROM CSR INTO @Col1, @Col2; 
END 

CLOSE CSR; 
DEALLOCATE CSR; 
0

Die Staging-Tabelle Ansatz kam mir kurz nachdem ich das gepostet habe, und das ist die Route, mit der ich ging. Obwohl es nicht ideal für solch ein einfaches Paket ist, funktioniert es. Ein Cursor wird nicht einmal notwendig sein ... für dieses Paket kann ich einfach die entsprechende Tabelle aus der Staging-Tabelle aktualisieren, keine Notwendigkeit für eine gespeicherte Prozedur. Danke euch beiden!

Verwandte Themen