PowerShell i SQL 20 – modyfikacja danych

6-lis-2016

Oczywiście po to jest baza danych aby przechowywać w niej rekordy. Oto jak można dodawać, wyświetlać, modyfikować i usuwać rekordy:

Dodawanie rekordów

Zaczynamy od zwykłego polecenia SQL –  INSERT. Treść tego polecenia umieszczamy w zmiennej tekstowej.  Następnie jak zwykle tworzymy obiekt serwera i bazy danych. Obiekt bazy danych posiada metodę ExecuteNonQuery, która takie polecenie INSERT wykona na serwerze zwracając tylko informację, czy polecenie się udało czy nie.

 $sql = "INSERT INTO Test2 VALUES ('First'),('Second'),('Third')"
$SqlServer = New-Object Microsoft.SqlServer.Management.SMO.Server 'SQL01'
$db = $SqlServer.Databases["tempdb"]
$db.ExecuteNonQuery($sql)

Wyświetlanie rekordów – SELECT

Aby sprawdzić zawartość tabeli rozpocznij od stworzenia odpowiedniego polecenia SELECT. Mając je (i mając obiekt serwera i bazy, które zostały już utworzone w poprzednim przykładzie), można skorzystać z metody ExecuteWithResults, które przesyła zapytanie na serwer i zwraca wynik. Wynik ten to tzw. DataSet. DataSet składa się z tabel. Ponieważ nasze zapytanie zwraca tylko jedną tabelę, to wynik znajduje się w zerowej tabeli zwróconego wyniku (numeracja w PowerShell zaczyna się od zera)

$sql = 'SELECT * FROM Test2'
$result = $db.ExecuteWithResults($sql)
$result.GetType()
$result.Tables[0]

Aktualizacja rekordów – UPDATE

UPDATE można wykonać tak jak INSERT. Cała operacja polega więc na zbudowaniu odpowiedniego polecenia SQL, które jest wysyłane na serwer przez ExecuteNonQuery. Ponownie ExecuteWithResults pozwoli sprawdzić, że rekord rzeczywiście został zaktualizowany:

$sql = "UPDATE Test2 SET NAME = 'LAST' WHERE ID = 3"
$SqlServer = New-Object Microsoft.SqlServer.Management.SMO.Server 'SQL01'
$db = $SqlServer.Databases["tempdb"]
$db.ExecuteNonQuery($sql)
$sql = 'SELECT * FROM Test2'
$result = $db.ExecuteWithResults($sql)
$result.Tables[0]

Usuwanie rekordów – DELETE

DELETE podobnie jak INSERT oraz UPDATE polega na wykonaniu na serwerze polecenia SQL usuwającego rekord za pomocą metody ExecuteNonQuery

$sql = "DELETE FROM Test2 WHERE ID = 3"
$SqlServer = New-Object Microsoft.SqlServer.Management.SMO.Server 'SQL01'
$db = $SqlServer.Databases["tempdb"]
$db.ExecuteNonQuery($sql)
$sql = 'SELECT * FROM Test2'
$result = $db.ExecuteWithResults($sql)
$result.Tables[0]

Modyfikacja danych przez Invoke-Sqlcmd

Jedyna różnica jest taka, że zamiast odwoływać się jawnie do obiektów SMO, ładujemy najpierw moduł sqlps a następnie za pomocą Invoke-Sqlcmd wykonujemy na serwerze przygotowane polecenie SQL, które jeśli modyfikuje dane, to po prostu nic nie zwróci, a jeśli jest zapytaniem o dane to zwróci obiekt DataTable. W Poniższym przykładzie dodajemy rekord „4”, a następnie sprawdzamy, czy rekord pojawił się w tabeli.

Import-module Sqlps
Invoke-Sqlcmd -ServerInstance SQL01 -Database tempdb `
-Query "INSERT Test2 VALUES('Fourth')"
Invoke-Sqlcmd -ServerInstance SQL01 -Database tempdb `
-Query "SELECT * FROM Test2"

Zauważmy przy tym, że obiekt tabeli pobrany z napędu SQLServer:, jak poniżej nie posiada metody „AddRow” ani kolekcji rekordów „Items”. Przy użyciu tego obiektu można modyfikować właściwości tabeli, ale nie dane, które się w tej tabeli znajdują.

$t2 = Get-item sqlserver:\sql\sql01\Default\Databases\tempdb\Tables\dbo.Test2
$t2 | gm
$t2.RowCount

 

Komentarze są wyłączone

Autor: Rafał Kraik