2013-08-20 18 views
16

Mam pakiet SSIS, który zawiera wiele przepływów.Pakiet SSIS nie chce pobierać metadanych tabeli tymczasowej

Każdy przepływ jest odpowiedzialny za utworzenie tabeli "przemieszczania", która zostanie wypełniona po utworzeniu. Te tabele to tabele tymczasowe globalne.

Dodałem 1 dodatkowy przepływ (nie wykonałem paczki), który robi dokładnie to, co podano powyżej, dla innego stołu. Jednak z jakiegoś powodu pakiet nie działa sporadycznie na ten przepływ, podczas gdy jest on dokładnie taki sam jak inne, oprócz niektórych nazw tabel.

Błąd, który wciąż pojawiały się: wyrażenie

Update - Insert Data Flow:Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005. An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "Unspecified error". An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "The metadata could not be determined because statement 'select * from '##TmpMcsConfigurationDeviceHistory86B34BFD041A430E84CCACE78DA336A1'' uses a temp table.".

utworzenia:

"CREATE TABLE " + @[User::TmpMcsConfigurationDeviceHistory] + " ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL) 

"

analizowany wyrażenie (= analizowany):

CREATE TABLE ##TmpMcsConfigurationDeviceHistory764E56F088DC475C9CC747CC82B9E388 ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL) 

Odpowiedz

0

Stwierdziłem, że problem leży w duplikacie GUID, skopiowałem elementy (takie jak ten do tworzenia tabel tymczasowych) i wszystkie otrzymały ten sam Guid po skopiowaniu. Użyłem narzędzia, aby zresetować wszystkie te guids w mojej paczce i to rozwiązało mój problem.

Dzięki!

8

Jeżeli jesteś praca nad SSIS 2012 , następnie używa systemowej procedury przechowywanej sp_describe_first_result_set, aby pobrać metadane tabel i nie obsługuje tabel tymczasowych. Ale możesz przejść do innych opcji, takich jak zmienne tabelowe i CTE, które będą działać poprawnie. https://connect.microsoft.com/SQLServer/feedback/details/629077/denali-engine-metadata-discovery-shuns-temp-tables

+1

używam zmiennych stole w moim przepływów danych (To mój pierwszy dzień za pomocą SSIS więc mam nadzieję, poprawne), zawierają po prostu DDL do tworzenia tabeli tymczasowej, podobnie jak wszystkie inne przepływy danych (podczas gdy działa on w innych przepływach danych). – Mortana

+1

Jak widzę to w opisie błędu, zapytanie kwerendy jest uruchamiane w stosunku do tabeli tymczasowej, która z kolei prosi o dane meta. wybierz * z '## TmpMcsConfigurationDeviceHistory86B34BFD041A430E84CCACE78DA336A1' – Sonam

+0

Przeprowadź ten przepływ danych i sprawdź, czy powyższe zapytanie jest uruchomione, czy nie. – Sonam

13

Inna opcja (rodzaj hackowania, ale działa i nie wymaga zmiany globalnych tabel tymczasowych) polega na użyciu polecenia SET FMTONLY ON przed faktycznym zapytaniem w celu wysłania fałszywego " Pierwszy zestaw wyników "do SSIS z poprawną strukturą kolumny. Więc można zrobić coś takiego

SET FMTONLY ON 
select 0 as a, 1 as b, 'test' as C, GETDATE() as D 
SET FMTONLY OFF 

select a, b, c, d from ##TempTable 

Kiedy SSIS biegnie sp_describe_first_result_set, zwróci nazwy metadanych i kolumny polecenia FMTONLY i nie będzie narzekać nie jest w stanie określić metadane tabeli temp bo to nawet nie spróbuje.

+0

Dzięki, byłem w miejscu, w którym był spust przy użyciu tymczasowego stołu i nie mogłem dotknąć spustu (nie pytaj) ... To było to, czego potrzebowałem – Rikon

+0

Półtora roku później i nadal pomocne. Dzięki Kyle. –

+0

Zadziałało. Musiałem zrobić jeszcze kilka kroków, aby to zadziałało. Moje zapytanie zawierało 40 pól, niektóre z nich bigint, niektóre dziesiętne (19,4). W fałszywym wyborze wewnątrz FMTONLY musiałem napisać wiele razy coś takiego jak CAST (NULL AS DECIMAL (19,4)) jako MyDecimalField. –

0

Miałem ten sam problem, ponieważ używamy tabeli tymczasowej do przemieszczania. Po spędzeniu trochę czasu znalazłem pracę.

W zadaniu OLE DB/ADO przeznaczenia przepływu danych, w którym należy podać nazwę tabeli pomostowej.

Zmień właściwość AccessMode na polecenie SQL zamiast OpenRowSet i określ właściwość SQL Command na "wybierz * z #temp".

Hurra, działa zgodnie z oczekiwaniami.

Złap tutaj, gdy określasz tryb dostępu inny niż polecenie SQL, SSIS oczekuje, że będzie to tabela/widok i zmieniła SSIS na wywołanie sp_describe_first_result_set, aby pobrać dane meta. ale po określeniu polecenia SQL, oczekuje się zapytania lub polecenia SP itd., więc na szczęście nadal używa starego sposobu uzyskiwania metadanych.

http://social.msdn.microsoft.com/Forums/sqlserver/en-US/cfe1c7c1-910a-4f52-9718-c3406263b177/usage-of-temp-tables-in-ssis-2012?forum=sqlintegrationservices#cfe1c7c1-910a-4f52-9718-c3406263b177

20

Using WITH RESULT SETS to explicitly define the metadata pozwoli SSIS pominąć krok sp_describe_first_result_set i korzystać z metadanych, które można zdefiniować. Plusem jest to, że możesz użyć tego, aby SSIS wykonał SQL, który zawiera tabelę tymczasową (dla mnie ta wydajność bardzo pomogła); wadą jest to, że musisz ręcznie konserwować i aktualizować, jeśli coś się zmieni.

próbka

Query (procedura przechowywana :)

EXEC ('dbo.MyStoredProcedure') 
    WITH RESULT SETS 
     (
     (
      MyIntegerColumn INT NOT NULL, 
      MyTextColumn VARCHAR(50) NULL, 
      MyOtherColumn BIT NULL 
     ) 
    ) 

próbka zapytań (SQL proste :)

EXEC (' 
    CREATE TABLE #a 
     (
     Col INT 
    ) 
    INSERT INTO #a 
     (
     COL 
    ) 
    SELECT 1 AS Col 

    SELECT Col 
    FROM #a') 
WITH RESULT SETS ((Col INT NOT NULL)) 
) 
+2

To jest odpowiedź, która zadziałała dla mnie. Powyższa odpowiedź z poleceniami FMTONLY zakończyła się wysłaniem 0 wierszy do wyjścia podczas rzeczywistej ETL. – efesar

+0

Dzięki - to było naprawdę przydatne rozwiązanie, na które się natknąłem. – MISNole