Własna kontrolka SSIS, część 3 – O pobieraniu danych

Wiemy jak w podstawowy sposób odczytać listę plików w katalogu na serwerze. To teraz pobierzmy te pliki. Jeden z kroków kontenera pakietu SSIS generuje plik tekstowy zawierający listę plików do pobrania. Każdy z plików jest podawany w odrębnej linii – potem wczytamy plik, rozbijemy go na linie i w pętli wczytamy każdy z nich po kolei.

Dla przypomnienia – ważne jest, żeby podawać pełne ścieżki do plików względem katalogu głównego. Przeglądając dokumentację WinSCP zauważyłem jeszcze jedną nowość w wersji 5.8 beta: pojawił się parametr string FullName , który zwraca pełną ścieżkę do pliku. Nie trzeba będzie sklejać parametru przesyłanej ścieżki z nazwą pliku odczytaną jako Name. Ponieważ w kontrolce będziemy korzystać z wersji beta biblioteki to warto mieć na uwadze.

Przejdźmy do kodu. Na razie popatrzymy jak to wygląda w Powershell. Podobnie jak poprzednio zaczynamy od parametrów i funkcji, która pobierze plik. Nadal korzystamy z przykładu z dokumentacji.
Czytaj dalej

Własna kontrolka SSIS, część 2

Tym razem popatrzymy na obsługę jednej z dwóch funkcjonalności kontrolki. Sprawdzimy jakie pliki są na serwerze w katalogu, który nas interesuje, a w następnym poście pobierzemy pliki, które nam wyjdą z przepatrywania metadanych i tabel pomocniczych. Obie funkcjonalności będą obsługiwane z wykorzystaniem winscp.dll.

W obecnym rozwiązaniu pobieranie listy plików wykorzystuje trochę zmodyfikowany przykładowy skrypt przeszukiwania plików katalogu. Ten dostępny na stronie jest nieco bardziej zaawansowany – bo wręcz pobiera pliki i sprawdza ich zawartość, a nas interesuje tylko lista plików (ewentualnie z jakąś maską – np. chcemy tylko pliki .csv). Pierwszy zmodyfikowany fragment definiujący funkcję SearchDirectory poniżej. Czytaj dalej

Własna kontrolka SSIS, część 1

Skoro znamy już wymagania i z grubsza zakres pomyślmy jak podejść do tematu własnej kontrolki. Opcji mamy mnóstwo, ale weźmy pod uwagę dwie:

  • albo patrzymy co mamy i bierzemy pod uwagę, że da się to usprawnić
  • albo wymyślamy koło na nowo

Wybieram bramkę numer jeden. Przyjrzę się co mam teraz i przy dalszej analizie może wyciągnę wnioski co poprawić, co wyciąć, co dodać i może będzie tak, że z początkowego pomysłu zostanie nic. Albo i nic nie zostanie.

Co mamy?

Obecne rozwiązanie przypomina czasem coś co się trzyma na ślinę, sznurek i kawałek taśmy klejącej. Ale działa. Do tego działa dobrze (rzecz jasna o ile nie wystąpią błędy) i nawet da się popatrzeć co się działo po kolei. W końcu prowizorki są najtrwalsze. Czytaj dalej

Własna kontrolka SSIS, część 0

Zadanie jest stosunkowo proste

Słuchaj, bo to jest tak. Na serwer FTP wpadają pliki. Musimy je pobrać do siebie i zasilić bazę danymi. Z tych plików właśnie. No.” Proszę bardzo. Wykorzystujemy do tego SSIS (dla punktu zaczepienia przyjmijmy wersję 2012). Możemy do tego wykorzystać standardową kontrolkę FTP z SSIS. Przeciągamy co trzeba, konfiguracja, kilka poprawek, test i działa – mamy pliki u siebie. Czas na kawę #2.
Czytaj dalej

Wywołaj sqlcmd z PowerShell

Zadanie jest proste: mamy skrypt z poleceniami SQL, który chcemy wywołać przez sqlcmd. Ale – w skrypcie wykorzystujemy zmienną, która na dodatek zawiera ścieżkę do katalogu. Jako przykład niech posłuży taki fragment zapisany w pliku SELECT.sql:

SELECT Imie = 'Bartek', Zmienna = '$(ScriptPath)'

Wywołanie z poziomu cmd nie stwarza problemów:

C:\> cd tmp
C:\tmp> sqlcmd -r1 -v ScriptPath="C:\tmp" -i SELECT.sql -S Serwer-f 1250
Bartek Zmienna
------ -------
Bartek C:\tmp

Poszczególne przełączniki oznaczają:

  • -r1 – chcę zobaczyć błędy na ekranie
  • -v – przekazuję zmienną o nazwie ScriptPath z wartością zawierającą jakąś ścieżkę
  • -i – nazwa skryptu wejściowego
  • -S – mój serwer
  • -f – strona kodowa

I super, a jeśli potrzebujemy uruchomić w PowerShell?

PS C:\tmp> sqlcmd -r1 -v ScriptPath="C:\tmp" -i SELECT.sql -S Serwer -f 1250
Sqlcmd: ':\tmp': Invalid argument. Enter '-?' for help.PS C:\tmp>

Czemu tak?
Czytaj dalej

Konfiguracja SSMS pod kątem prezentacji

Bardzo często stawiam nowe maszyny wirtualne pod kątem prowadzonych testów czy prezentacji. Za każdym razem konfiguruję od nowa ustawienia SQL Server Management Studio i za każdym razem muszę sobie przypominać gdzie się klikało daną opcję, albo co tam jeszcze było do zrobienia. Tu spisuję te ustawienia w jednym miejscu.
Czytaj dalej

SNAPSHOT vs READ COMMITTED

We wrześniu prowadziłem krótki warsztat SQL. Podczas poruszania tematu poziomów izolacji transakcji padło pytanie, na które nie potrafiłem udzielić odpowiedzi. Chodziło o interakcję dwóch poziomów izolacji: SNAPSHOT i READ COMMITTED, a ja z trybem SNAPSHOT miałem do czynienia głównie w książkach i niestety nie pamiętałem dokładnie co się stanie.

„Załóżmy, że mamy dwie sesje o poziomach izolacji SNAPSHOT i READ COMMITTED, które operują na tym samym zbiorze danych. Sesja nr 1 (SNAPSHOT) odczytuje dane, w tym czasie sesja nr 2 (READ COMMITTED) aktualizuje dane – np jeden rekord. Po tej aktualizacji sesja nr 1 chce usunąć rekord zaktualizowany w sesji nr 2. Co się stanie? Jaki będzie wynik?”

Przeprowadźmy test. Zakładam nową bazę, w której włączam obsługę trybu SNAPSHOT oraz tabelę, w której będę modyfikował jeden rekord. Czytaj dalej

Kto wdrażał projekt do SSISDB?

Jeśli pojawi się potrzeba wskazania palcem osoby, która wdrożyła do SSISDB projekt, który nie przechodzi walidacji albo powoduje błędy przetwarzania możemy skorzystać z widoku catalog.operations:

SELECT TOP 10
	o.created_time,
	o.object_name,
	o.start_time,
	o.caller_name
FROM SSISDB.catalog.operations o
WHERE
	1 = 1
	AND o.operation_type = 101          -- 101 == deployment
	AND o.object_name = '<nazwa_projektu>'
ORDER BY
	o.operation_id DESC

Można też wykorzystać bezpośrednio tabelę internal.operations, ale opis struktury i informacja o szukanym typie operacji jest w dokumentacji widoku catalog.operations.

87. Spotkanie PLSSUG – dodatek o FILESTREAM

7 maja 2015 roku na 87. spotkaniu warszawskiej grupy PLSSUG prowadziłem sesję nt. FILESTREAM w SQL Server. Zostały dwa pytania, na które chciałbym uzupełnić odpowiedź.

1. Czy można utworzyć grupę plików zawierającą FILESTREAM na zasobie sieciowym?

W pierwszej chwili odpowiedziałem, że nie – z tego co wiem, nie można założyć grupy FILESTREAM na zasobie sieciowym – musi być bezpośrednio na dysku. Swoją wiedzę opierałem na dokumencie Paula Randalla nt. FILESTREAM oraz jego wpisie na blogu, który ponownie mówi o tym, że reguły tworzenia grup plików pod FILESTREAM maja takie same zasady, jak tworzenie plików baz danych i logów. Przed sesją nie sprawdziłem tego dokładnie, ale kiedy na sesji padło pytanie przypomniałem sobie, że informacje od Paula Randalla pochodzą z 2008 i 2010 roku, a SQL Server 2012 wprowadził możliwość tworzenia plików na zasobach sieciowych. Ale o tym, że jest adnotacja „Filestream is currently not supported on an SMB file share.” już nie pamiętałem – stąd moje zawahanie i stwierdzenie, że się nie da, ale jeszcze sprawdzę.
Czytaj dalej

Rozmnożenie sesji Activity Monitora

Z Activity Monitora SQL Servera korzystam raczej rzadko – i tak właściwie nie pokazuje mi tego, co mnie interesuje poza I/O na bazie. Jedną z przypadłości Activity Monitora jest rozmnożenie sesji w sekcji „Proceses”, na które nie zwróciłbym uwagi, gdyby nie kolega, który zdziwił się, że widzi wiele sesji, mimo że serwer ma ustawiony parametr MAXDOP 2. Skąd to rozmnożenie? (Sprawdzane na SQL Server 2012 SP2)
Czytaj dalej