Obecnie piszę pakiet SSIS, który pobiera dane z procedury składowanej za pośrednictwem źródła OLE DB. Procedura przechowywana zawiera dość nieprzyjemne zapytanie, które udało mi się poprawić przy użyciu tabel tymczasowych. Jeśli przełączę te tabele tymczasowe na zmienne tabel, logiczny odczyt wynosi od około 1,3 miliona do około 56 milionów. Jestem dość niekomfortowy z 1,3 miliona, ale nie ma sposobu, żebym był zadowolony z 56 milionów odczytów logicznych. Tak więc nie mogę naprawdę przekonwertować tabel tymczasowych na zmienne tabel.Procedura składowana SSIS wykorzystuje tabelę tymczasową 2008 i 2014
Jednak SSIS (lub raczej SQL Server) nie może rozwiązać metadanych dla tego zapytania, więc pakiet nie zostanie uruchomiony. Znalazłem kilka różnych rozwiązań w Internecie, ale żaden z nich nie działa na obu serwerach SQL Server 2008 i SQL Server 2014. Obecnie jesteśmy w trakcie aktualizacji wszystkich naszych serwerów do 2014 r., A ten konkretny pakiet działa w roku 2008 w DEV, 2014 w QA, a 2008 w produkcji obecnie. Jesienią, warstwa PROD będzie 2014, a poziom DEV będzie promowany po pewnym czasie. Niestety, nie mogę się doczekać, aż te uaktualnienia wydadzą ten pakiet SSIS. Dane muszą zacząć działać w przyszłym tygodniu. W związku z tym muszę znaleźć sposób, aby metadane zostały rozwiązane dla obu środowisk. Oto, co starałem dotąd:
Dodaj obojętne wybierz w bloku
IF 1=0
która zwraca prawidłowego metadanych. Działa to w 2008, ale nie w 2014.Użyj
SET FMTONLY OFF
na początku procedury przechowywanej. Działa to w 2008 r., Ale nie w 2014 r. Ponadto powoduje, że procedura składowana jest uruchamiana raz dla każdej zwróconej kolumny (w tym przypadku ponad 30), co jest rozwiązaniem wyłączającym, nawet jeśli zadziałało.Użyj
EXEC ... WITH RESULT SETS ((...));
. Działa to w 2014, ale nie w roku 2008.Wdróż procedurę przechowywaną, która zwraca właściwe metadane, zbuduj i wdróż pakiet SSIS, a następnie zmodyfikuj procedurę składowaną do odpowiedniej wersji. Wydaje się, że nie działa to w żadnym środowisku, co komplikowałoby inne aplikacje ETL opracowane w ramach naszego ETL.
Jeśli nie mogę nic wymyślić, mógłbym wdrożyć różne procedury składowane i pakiety na różnych poziomach, ale bardzo bym wolał od tego. Po pierwsze, komplikowałoby to przyszłe wydania i musiałem również zapewnić, że nie zapomnę o aktualizacji procedury przechowywanej i pakietu po aktualizacji serwerów.
Mogę również tworzyć prawdziwe tabele w bazie danych, które zastąpią te tabele tymczasowe. Nie podoba mi się to rozwiązanie, ale jest to coś, co mógłbym znieść. Jeśli to zrobię, prawdopodobnie przełożę się na korzystanie z WITH RESULT SETS
w przyszłości.
Jednak osobiście nie przejmuję się żadnym z tych rozwiązań, więc zastanawiałem się, czy istnieje jakieś obejście, które przeoczyłem, które może działać nieco lepiej.
Doskonały pierwszy wpis, w którym wyraźnie wykonałeś swoje badania. Dodatkowe badania dla ciebie na [temp table versus table variable] (http://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in- sql-server) – billinkc
Czy próbowałeś kombinacji 1 i 3? Pojedynczy zapisany proces, który ma ZARÓWNO 'Z zestawami wyników ...' AND 'IF 1 = 0..'? –
Problem polega na tym, że
WITH RESULT SETS
nie jest dostępny w 2008 roku, więc zapytanie nie będzie działać w trybie DEV lub PROD. – Nelson