2013-10-29 11 views
5

Mam przechowywany proc jako tekst polecenia SQL, który jest przekazywany do parametru zawierającego nazwę tabeli. Proces zwraca dane z tej tabeli. Nie mogę wywołać tabeli bezpośrednio jako źródło OLE DB, ponieważ pewna logika biznesowa musi się zdarzyć z zestawem wynikowym w proc. W SQL 2008 wszystko działało dobrze. W uaktualnionym pakiecie 2012 otrzymuję komunikat "Nie można ustalić metadanych, ponieważ ... zawiera dynamiczny SQL. Rozważ użycie klauzuli WITH RESULT SETS, aby jawnie opisać zestaw wyników."Używanie dynamicznego SQL w źródle OLE DB w SSIS 2012

Problem polega na tym, że nie mogę zdefiniować nazw pól w proc, ponieważ nazwa tabeli przekazywana jako parametr może być inną wartością, a pola wynikowe mogą być za każdym razem inne. Ktoś napotyka ten problem lub ma jakieś pomysły? Próbowałem różnych rzeczy z dynamicznym SQL używając "dm_exec_describe_first_result_set", tabel tymczasowych i CTE, które zawiera Z ZESTAWEM WYNIKÓW, ale nie działa w SSIS 2012, ten sam błąd. Kontekst jest problemem z wieloma dynamicznymi podejściami SQL.

Jest to najnowszy rzeczą próbowałem, bez powodzenia:

DECLARE @sql VARCHAR(MAX) 
SET @sql = 'SELECT * FROM ' + @dataTableName 

DECLARE @listStr VARCHAR(MAX) 
SELECT @listStr = COALESCE(@listStr +',','') + [name] + ' ' + system_type_name FROM sys.dm_exec_describe_first_result_set(@sql, NULL, 1) 

exec('exec(''SELECT * FROM myDataTable'') WITH RESULT SETS ((' + @listStr + '))') 
+0

Co jeśli spróbowałeś 'SET FMTONLY OFF; EXEC MyProc' w Twoim źródle OLEDB. Czy to jest lepsze? – billinkc

+0

Próbowałem, ale to nie działa. SSIS potrzebuje metadanych. – jdf35

+0

Bummer. Gdyby ta sztuczka działała dla przyjaciela zajmującego się tymczasowymi tabelami, kiedy przeprowadzali się w latach 2008-2012. – billinkc

Odpowiedz

4

Więc pytam z dobroci, przez czemu na zielonej ziemi Boga używasz zadanie SSIS przepływu danych do obsługi dynamicznych danych źródłowych, takich jak ten ?

Powodem używasz w kłopoty dlatego jesteś wypaczając każdy cel danego zadania SSIS przepływu danych:

  • wyodrębnić znaną ze znanego źródła metadanych, które mogą być wpisane statycznie i buforowane w projektowaniu -time
  • biec przez znanego procesu z prostą (i idealnie asynchroniczny) Przekształcenia
  • wziąć to przekształconych danych i załadować go do znanego przeznaczenia również o znanej metadanych

Dobrze jest mieć sparametryzowane źródła danych, które przywracają różne dane. Ale za każdym razem, gdy przywożą zupełnie inne metadane bez zgodności z różnymi zestawami, jest to szczerze mówiąc absurdalne i nie jestem całkiem pewien, czy chcę wiedzieć, w jaki sposób traktowałeś wszystkie metadane kolumn w pakiecie Working 2008.

Dlatego chce dodać zestaw Z WYNIKAMI do zapytania SSIS, aby mógł wygenerować niektóre metadane. Nie robi tego w czasie wykonywania - nie może! Musi on mieć znany zestaw kolumn (ponieważ i tak aliże je wszystkie do zmiennych skompilowanych), z którymi można pracować. Oczekuje tych samych kolumn za każdym razem, gdy uruchomi to zadanie przepływu danych - dokładnie te same kolumny, aż do nazw, typów i ograniczeń.

Co prowadzi do jednego (strasznego, okropnego) rozwiązania - po prostu przyklej wszystkie dane do tabeli tymczasowej z Kolumna 1, Kolumna2 ... Kolumna N, a następnie użyj tej samej zmiennej, której używasz jako parametru nazwy tabeli do warunkowo oddziału Twój kod i rób, co chcesz z kolumnami.

Innym bardziej rozsądnym rozwiązaniem byłoby utworzenie zadania przepływu danych dla każdej z tabel źródłowych i użycie parametru w ograniczeniu pierwszeństwa, aby wybrać, które zadanie przepływu danych powinno zostać uruchomione.

Aby znaleźć rozwiązanie niedostatecznie dostosowane do nieoczekiwanego ETL-a, należy również wziąć pod uwagę przetwarzanie własne w języku C# lub zadanie skryptowe zamiast Zadanie przepływu danych zapewniane przez SSIS.

Krótko mówiąc, nie rób tego. Pomyśl o dzieciach (pakiety)!

+0

To dobrze w teorii, ale w praktyce, jeśli masz 230 pakietów SSIS, które muszą zostać zaktualizowane do 2012 roku z setkami źródeł bazy danych OL, i działającymi tak idealnie w 2008 roku, to szukasz szybkiego rozwiązania. – jdf35

1

Do tego celu użyłem CozyRoc Dynamic DataFlow Plus.

Używanie tabel konfiguracyjnych do budowania instrukcji SQL Select, Mam pojedynczy pakiet SSIS, który ładuje dane z Oracle i Sybase (lub dowolnego źródła OLEDB) do MS SQL. Niektóre zestawy wyników znajdują się w milionach wierszy, a wydajność jest doskonała.

Zamiast pisać nową paczkę za każdym razem, gdy potrzebna jest nowa tabela, można ją skonfigurować w ciągu kilku minut i uruchomić na przetestowanym i niezawodnym istniejącym pakiecie.

Bez tego byłbym gotowy napisać setki paczek.

Powiązane problemy