Monthly Archives: Sierpień 2013

Mój pierwszy artykuł na technecie już dostępny !!! :)

Wczoraj na stronach polskiego technetu ukazał się artykuł mojego autorstwa. Tematem artykułu jest wykorzystanie dysków SSD jako rozszerzenia puli buforów w SQL Server 2014. Mam nadzieję, że artykuł się wam spodoba, gdyż na temat nowości w kolejnej platformie bazodanowej firmy Microsoft mam zamiar jeszcze co nieco napisać 🙂

Zapraszam do lektury:

Nowości w SQL Server 2014 CTP1 – Buffer Pool Extension

Reklamy

Jak użyć tabeli tymczasowej wewnątrz kolejnych zadań SSIS

Dzisiejszym wpisem chciałbym wam pokazać w jaki sposób możemy używać tabel tymczasowych wewnątrz kolejnych zadań pakietu SSIS.

Przykładowe zadanie

Mój przykład będzie polegał na stworzeniu paczki SSIS zawierającej dwa zadania. Pierwsze z nich stworzy tabelę tymczasową, a drugie skorzysta z niej.

Przygotowanie paczki

Na początku przechodzimy do SQL Server Data Tools, tworzymy standardowy projekt SSIS a w nim paczkę. Pierwszą sprawą, o jaką powinniśmy zadbać jest stworzenie managera połączeń. Aby to zrobić klikamy prawym przyciskiem w sekcji Connection Manager i wybieramy odpowiedniego dostawcę (ja wybrałem „OLE DB”):

SSIS_TABELE_TYMCZASOWE_01

Kolejnym krokiem jest wykreowanie w paczce zadania tworzącego tabelę tymczasową. Użyjemy do tego zadania „Execute SQL Task”. Przeciągamy je do zakładki „Control Flow” i klikamy dwa razy w celu edycji właściwości:

SSIS_TABELE_TYMCZASOWE_03

Wewnątrz tego zadania w sekcji SQLStatement umieszczamy kod  kreujący tabelę tymczasową:

CREATE TABLE #t(
 [BusinessEntityID] int PRIMARY KEY,
 [LastName] nvarchar(50)
)

Drugie z zadań w paczce ma polegać na dowolnym użyciu tabeli tymczasowej. W tym celu ponownie przeciągamy zadanie „Execute SQL Task”, tym razem jednak w sekcji SQLStatement wpisujemy kod zliczający ilość wierszy:

SELECT COUNT(*) FROM #t

SSIS_TABELE_TYMCZASOWE_04

Łączymy oba zadania tak aby najpierw wykonał się kod tworzący tabelę oraz uruchamiamy paczkę za pomocą klawisz F5:

SSIS_TABELE_TYMCZASOWE_05

Niestety kod drugiego z zadań nie wykonał się poprawnie !!!

Przeglądając zakładkę „Execution Results” możemy zauważyć, że przyczyną problemu jest brak (wcześniej stworzonej) tabeli tymczasowej:

[Execute SQL Task] Error: Executing the query „SELECT COUNT(*) FROM #t” failed with the following error: „Invalid object name ‚#t’.”. Possible failure reasons: Problems with the query, „ResultSet” property not set correctly, parameters not set correctly, or connection not established correctly.

Dlaczego tak się stało?

Domyślnie Usługi Integracyjne SQL Server nawiązują i kończą połączenia do bazy w ramach istniejących zadań. W naszym przypadku mieliśmy dwa zadania, a więc po stworzeniu tabeli tymczasowej w ramach pierwszego z nich zamknęliśmy połączenie i straciliśmy ją. Dowodem na to może być poniższy zrzut ekranu, który przedstawia ślad SQL Server Profiler-a wygenerowany podczas działania naszej paczki:

SSIS_TABELE_TYMCZASOWE_06

Jak w takim razie pozbyć się tego problemu?

Rozwiązaniem jest użycie opcji „RetainSameConnection” naszego connection managera. Klikamy na niego prawym przyciskiem i z menu kontekstowego wybieramy opcję „Properties”. Po prawej stronie ekranu powinna pojawić się zakładka z jego właściwościami, gdzie możemy zmienić domyślne zachowanie:

SSIS_TABELE_TYMCZASOWE_07

W momencie ustawienia opcji RetainSameConnection na „True” SSIS nie będzie zamykał połączeń po każdym z zadań, a nasza paczka zacznie działać:

SSIS_TABELE_TYMCZASOWE_08

Podsumowanie

Usługi Integracyjne SQL Server nawiązują oraz kończą połączenia z bazą danych w ramach zadań zdefiniowanych przez użytkownika podczas tworzenia paczki (co jest zachowaniem domyślnym). W przypadku, gdy  kilka zadań używa tych samych obiektów tymczasowych to powinniśmy zmienić opcję RetainSameConnection naszego managera połączeń, tak aby połączenia nie były zamykane i otwierane na nowo.