Jedną z największych zalet Powershell jest to, że można w nim wykorzystywać wszelkie klasy/metody z .Net Framework. To fantastyczne patrząc na to z punktu widzenia pracy z SQL, bo właściwie w .NET istnieje zbiór metod pozwalający na pracę z SQL. Przyjrzyjmy się na przykład wywołaniu procedury składowanej sp_helpdb wykonywanej z poziomu powershell.
Zacznijmy od tego, że wcale nie trzeba ładować żadnych dodatkowych bibliotek (porównaj z artykułem „Co to jest SMO„). Tworząc obiekt, wywołujesz po prostu konstruktor danej klasy. Tutaj tworzymy obiekt klasy SqlConnection i wypełniamy jego właściwość ConnectionString, co określa gdzie będziemy się łączyć.
$SqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionString = "Server=localhost;Database=AdventureWorks2014;Integrated Security=True"
Teraz pora na określenie, jakie polecenie ma być uruchomione. Tworzymy obiekt SqlCommand i określamy właściwości CommandText (nazwa procedury do uruchomienia), Connection (wskazujące na wcześniej utworzony obiekt SqlConnection) i CommandTimeout.
$SqlCommand = New-Object -TypeName System.Data.SqlClient.SqlCommand $SqlCommand.CommandText = "sp_helpdb" $SqlCommand.Connection = $SqlConnection $SqlCommand.CommandTimeout = 0
Dane odczytamy dzięki SqlAdapterowi. Jedyna właściwość, jaką trzeba zdefiniować to SelectCommand (wskazujemy na wcześniej zdefiniowany SqlCommand):
$SqlAdapter = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter $SqlAdapter.SelectCommand = $SqlCommand
Adapter musi gdzieś zapisać dane. Posłuży mu do tego obiekt DataSet. DataSet może składać się z kilku tabel, choć u nas wykorzystamy tylko jedną. W takim przypadku można było wykorzystać nawet sam obiekt DataTable.
$DataSet = New-Object -TypeName System.Data.DataSet
No i pora na uruchomienie polecenia. Jeżeli gdzieś wcześniej mamy jakiś błąd, to zapewne informacja o tym, że coś jest źle pokaże się dopiero tutaj. SqlAdapter wykorzystując SelectCommand połączył się do SqlConnection i dane zapisał w DataSet:
$SqlAdapter.Fill($DataSet)
Po wszystkim połączenie można zamknąć:
$SqlConnection.Close()
A na zakończenie można „skonsumować” wynik. Tutaj pytamy najpierw o ilość tabel (powinno wyjść 1), a potem wyświetlimy rekordy z tabeli zerowej (numeracja jest od 0).
$DataSet.Tables.Count $DataSet.Tables[0]
Ponieważ większość/jeśli nie wszystkie czynności można w SQL wykonać za pomocą zapytań i procedur, masz właściwie gotowy przepis na odczytywanie danych z serwera i zmianę jego konfiguracji. Jako wady tego rozwiazania należy wymienić stosunkowo dużą liczbę poleceń do zapisania w skrypcie aby uzyskać wynik oraz niezbędną znajomość klas ADO.NET. A zalety, to stosunkowa „lekkość rozwiązania”. Nie trzeba było ładować żadnych dodatkowych modułów, a co za tym idzie również instalować ich na systemie.
Komentarze:
[…] W kolejnym przykładzie, spróbujemy uzyskać kilka informacji o instancji. Ponieważ informacje wyciągniemy z serwera wykorzystując zapytanie, przy okazji dowiesz się także jak uruchamiać zapytania na wybranej instancji SQL serwera w inny sposób niż pokazaliśmy to w części drugiej serii. […]