| Pozostałe opcje | |
| Zmienne skryptowe | |
| Polecenia wewnętrzne | |
| SQLCMD a Management Studio | |
| Podsumowanie | |
| Przeczytaj pozostałe części artykułu |
-a packet_size
Próbuje ustawić rozmiar pakietu sieciowego obowiązujący w czasie komunikacji narzędzia SQLCMD z instancją SQL Servera. Opcja ta ustawia zmienną skryptową SQLCMDPACKETSIZE. Liczba podana jako argument opcji -a musi być liczbą całkowitą i musi zawierać się w przedziale od 512 do 32767. W przeciwnym razie zostanie wygenerowany komunikat błędu. Domyślna wartość tej opcji to 4096.
W przypadku niemożliwości użycia podanego rozmiaru pakietu używany będzie rozmiar domyślny.
| Informacja |
Większy rozmiar pakietu może poprawić wydajność skryptów, w których występuje wiele składni Transact-SQL między poleceniami GO. |
-c cmd_end
Określa słowo kończące wsad Transact-SQL i wysyłające występujące przed nim polecenia do SQL Servera. Domyślnie wsady są kończone słowem GO.
Argument opcji –c nie powinien zawierać słów kluczowych języka Transact-SQL lub znaków o specjalnym znaczeniu dla systemu operacyjnego (nawet jeśli są one poprzedzone symbolem „\”). Nie zastosowanie się do tego zalecenia spowoduje, że praca z narzędziem SQLCMD będzie mocno utrudniona lub nawet niemożliwa (np. użycie słowa SELECT jako separatora wsadów uniemożliwi wykonywanie poleceń SELECT języka Transact-SQL).
| Informacja |
Pamiętaj, że słowo GO, domyślny koniec wsadu, nie jest elementem języka Transact-SQL. Słowo to jest interpretowane tylko przez narzędzia systemu SQL Server – SQLCMD i Management Studio. Jak widać, można je jednak zmienić na inne słowo (czego autor artykułu nie poleca, ponieważ taka zmiana może spowodować, że przestaną działać wcześniej napisane skrypty). |

Rys. 1. Zmiana słowa kończącego wsad T-SQL (tu na słowo START) w narzędziu SQLCMD.
-L [ c ] list servers [clean output]
Powoduje wylistowanie lokalnie skonfigurowanych serwerów (komputerów) i nazwy serwerów (komputerów) rozgłaszających w sieci. Opcja ta nie może zostać użyta z żadną inną opcją narzędzia SQLCMD.
Maksymalna liczba wylistowanych serwerów, czyli rozmiar bufora, to 3000. Jeżeli ilość serwerów do wylistowania przekroczy rozmiar bufora, lista zostanie skrócona do 3000 pozycji i zostanie wyświetlony komunikat ostrzeżenia.
Jeżeli zostanie podany opcjonalny parametr c, zostaje zwrócona pusta lista serwerów. Użycie tego parametru może poprawić wydajność języków skryptowych.
| Informacja |
Narzędzie SQLCMD może nie otrzymać w odpowiednim czasie odpowiedzi od wszystkich serwerów. Dlatego wyniki użycia opcji –L mogą być różne za każdym uruchomieniem narzędzia. |
-p [ 1 ] print statistics [colon format]
Wyświetla statystyki wydajnościowe dla każdego zestawu wynikowego. Statystyki zawierają kolejno: rozmiar pakietu sieciowego, ilość transakcji przetworzonych przez SQL Server, czas wykonania wszystkich transakcji, średni czas wykonania jednej transakcji, średnią ilość transakcji na sekundę.
Czasy są wyrażone w milisekundach.
Jeżeli zostanie podany opcjonalny parametr 1, statystyki będą formatowane w postaci wartości oddzielanych dwukropkami. Podanie dodatkowego parametru o wartości innej niż 1 powoduje wygenerowanie komunikatu błędu.

Rys. 2. Wyświetlenie w narzędziu SQLCMD statystyk wydajnościowych.
-X [ 1 ] disable commands, startup script, environment variables [ and exit ]
Powoduje wyłączenie poleceń, które są uznawane za niebezpieczne, gdy narzędzie SQLCMD jest uruchamiane z pliku wsadowego. W momencie napotkania takiego polecenia narzędzie SQLCMD wyświetla komunikat ostrzeżenia i kontynuuje pracę.
Jeżeli zostanie podany opcjonalny parametr 1, narzędzie SQLCMD po napotkaniu niebezpiecznego polecenia generuje komunikat błędu i kończy pracę.
Polecenia wyłączane przez opcję –X to: ED i !!polecenie DOS.
Opcja –X ponadto powoduje, że zmienne środowiskowe nie są przekazywane do narzędzia SQLCMD (także powoduje, że skrypt podany w zmiennej skryptowej SQLCMDINI nie jest uruchamiany).
-? show syntax summary
Wyświetla składnię i opcje narzędzia SQLCMD.
Zmienne skryptowe to zmienne, które mają pewne znaczenie zarówno dla opcji narzędzia SQLCMD, jak i dla specjalnych poleceń tego narzędzia. Wartości zmiennych skryptowych można ustawić na kilka sposobów (im wyższy numer na poniższej liście, tym metoda ma wyższy priorytet i wartości ustawione daną metodą nadpisują wartości ustawione przy pomocy metod o niższych numerach):
1. | Ustawienie zmiennej środowiskowej na poziomie systemu operacyjnego – należy kliknąć prawym przyciskiem na ikonę „Mój komputer”, wybrać „Właściwości”, wejść w zakładkę „Zaawansowane”, kliknąć na przycisku „Zmienne środowiskowe” i ustawić odpowiednią zmienną w dolnej sekcji („Zmienne systemowe”). |
2. | Ustawienie zmiennej środowiskowej na poziomie użytkownika – należy kliknąć prawym przyciskiem na ikonę „Mój komputer”, wybrać „Właściwości”, wejść w zakładkę „Zaawansowane”, kliknąć na przycisku „Zmienne środowiskowe” i ustawić odpowiednią zmienną w dolnej sekcji („Zmienne użytkownika dla <nazwa_użytkownika>”). |
3. | Użyć składni SET X = Y w linii poleceń, gdzie X oznacza zmienną, a Y jej nową wartość (ustawiamy tak zmienną na poziomie sesji w konsoli), np. SET SQLCMDSERVER = "WARSAW\SQLINSTANCE2" |
4. | Użyć składni sqlcmd -v X=Y w linii poleceń, gdzie X oznacza zmienną, a Y jej nową wartość (ustawiamy tak zmienną na poziomie sesji narzędzia SQLCMD), np. sqlcmd –v SQLCMDSERVER = "WARSAW\SQLINSTANCE2" |
5. | :Setvar X Y, gdzie X oznacza zmienną, a Y jej nową wartość (ustawiamy tak zmienną na poziomie sesji narzędzia SQLCMD), np. :SetVar SQLCMDSERVER "WARSAW\SQLINSTANCE2" |
Poniższa tabela przedstawia listę zmiennych skryptowych dla narzędzia SQLCMD (zastosowania tych zmiennych można znaleźć w opisie opcji narzędzia SQLCMD w niniejszym artykule). Lista zawiera także informacje:
| • | o tym, jaka opcja narzędzia SQLCMD jest odpowiedzialna za przypisywanie wartości danej zmiennej, |
| • | o tym, czy można czytać (R) i nadpisywać (W) używając składni :Setvar w skryptach i podczas pracy interaktywnej z narzędziem SQLCMD, |
| • | o tym, jaka jest domyślna wartość danej zmiennej. |
| Zmienna | Opcja narzędzia SQLCMD | R/W | Wartość domyślna |
SQLCMDUSER | -U | R | "" |
SQLCMDPASSWORD | -P | -- | "" |
SQLCMDSERVER | -S | R | "LokalnaInstancjaDomyślna" |
SQLCMDWORKSTATION | -H | R | "NazwaMaszyny" |
SQLCMDDBNAME | -d | R | "" |
SQLCMDLOGINTIMEOUT | -l | R/W | "8" (sekund) |
SQLCMDSTATTIMEOUT | -t | R/W | "0" = czas nieskończony |
SQLCMDHEADERS | -h | R/W | "0" |
SQLCMDCOLSEP | -s | R/W | " " |
SQLCMDCOLWIDTH | -w | R/W | "0" |
SQLCMDPACKETSIZE | -a | R | "4096" |
SQLCMDERRORLEVEL | -m | R/W | 0 |
SQLCMDMAXVARTYPEWIDTH | -y | R/W | "256" |
SQLCMDMAXFIXEDTYPEWIDTH | -y | R/W | "0" = nieograniczone |
SQLCMDEDITOR |
| R/W | "edit.com" |
SQLCMDINI |
| R | "" |
W skryptach i w trakcie pracy interaktywnej z narzędziem SQLCMD użytkownik może też wykorzystać specjalne polecenia wewnętrzne narzędzia. Większość z tych poleceń musi być poprzedzona dwukropkiem. A oto pełna lista tych poleceń:
[ : ] ED
Uruchamia edytor tekstowy. Edytor może być użyty do edycji bieżącego lub ostatnio wykonanego wsadu Transact-SQL. Po dokonaniu edycji należy zapisać dokument i zamknąć program pełniący rolę edytora.
Edytor tekstowy jest określony przez wartość zmiennej skryptowej SQLCMDEDITOR. Domyślnym edytorem jest program edit.com.

Rys. 3. Konfiguracja SQL Server Management Studio jako edytora dla narzędzia SQLCMD.
[ : ] RESET
Czyści pamięć wykonanych w sesji narzędzia SQLCMD poleceń.
| Informacja |
Polecenia wykonywane w sesji narzędzia SQLCMD są zapamiętywane i dostępne pod przyciskami „góra” / „dół”. |
:List
Wyświetla listę poleceń z bieżącego wsadu Transact-SQL.
:Setvar <var> [ "value" ]
Określa zmienną skryptową narzędzia SQLCMD.
Zmienne skryptowe są dostępne przy użyciu następującego formatu: $(nazwa_zmiennej).
Wielkość liter nie jest rozróżniana w nazwach zmiennych.
Nazwy zmiennych nie mogą zawierać białych znaków.
Jeżeli deklarowana nowa wartość zmiennej zawiera białe znaki, musi zostać otoczona cudzysłowami.
Jeżeli w poleceniu :Setvar nie zostanie podana nowa wartość zmiennej, zmienna jest usuwana.
:Listvar
Wyświetla listę zmiennych skryptowych, które mają ustawione wartości.
Zostaną wyświetlone tylko zmienne, których wartości zostały ustawione przez opcje narzędzia SQLCMD (wymienione wcześniej w artykule zmienne z prefiksem SQLCMD) lub polecenie wewnętrzne :Setvar.

Rys. 4. Wyświetlanie listy zmiennych skryptowych w narzędziu SQLCMD.
:Error <filename>|STDERR|STDOUT
Przekierowuje wyjście błędów do pliku, stderr lub stdout. Domyślnie przekierowanie następuje do strumienia stderr.
Polecenie Error może występować wielokrotnie w skrypcie.
:Out <filename>|STDERR|STDOUT
Tworzy i przekierowuje wszystkie wyniki zapytań do pliku stderr lub stdout. Domyślnie przekierowanie następuje do stdout.
Polecenie Out może występować wielokrotnie w skrypcie.
:Perftrace <filename>|STDERR|STDOUT
Tworzy i przekierowuje wszystkie informacje śledzenia wydajności do pliku stderr lub stdout. Domyślnie przekierowanie następuje do stdout.
Polecenie Perftrace może występować wielokrotnie w skrypcie.
:On Error[ exit | ignore ]
Ustawia akcję, jaka ma być podjęta, gdy wystąpi błąd w trakcie wykonywania skryptu lub wsadu.
Gdy zostanie użyta opcja exit, narzędzie SQLCMD kończy pracę z odpowiednią wartością błędu.
Gdy zostanie użyta opcja ignore, narzędzie SQLCMD ignoruje błąd i kontynuuje wykonywanie skryptu lub wsadu. Domyślnie zostanie wyświetlony komunikat błędu.
[ : ] QUIT
Kończy pracę narzędzia SQLCMD.
[ : ] EXIT [ (statement) ]
Pozwala wykorzystać wynik zapytania SELECT jako wartość zwracaną z narzędzia SQLCMD. Wartość pierwszej kolumny z pierwszego wiersza jest konwertowana do 4-bajtowej liczby całkowitej (long). MS-DOS przekazuje niższy najniższy bajt do nadrzędnego procesu lub jako poziomu błędu w systemie operacyjnym. Windows 2000 przekazuje całą 4-bajtową liczbę.
Składnia jest następująca:
:EXIT(zapytanie)
Na przykład:
:EXIT(SELECT @@ROWCOUNT)
Jeżeli wywołanie narzędzia SQLCMD znajduje się w pliku wsadowym (.bat, .cmd), to można podawać parametry wsadu do składni SQL wykonywanej przy zamykaniu narzędzia SQLCMD:
sqlcmd –Q "EXIT(SELECT COUNT(*) FROM %1)"
Przykładowe wywołanie pliku wsadowego zawierającego powyższe wywołanie SQLCMD:

Rys. 5. Uruchomienie pliku wsadowego z poleceniem EXIT narzędzia SQLCMD.
Jeżeli w nawiasie polecenia EXIT zostanie podana niewłaściwa składnia Transact-SQL, narzędzie SQLCMD zakończy pracę bez zwracania wartości, a za to z komunikatem błędu SQL Servera.
Formaty polecenia EXIT są następujące:
:EXIT
Nie wykonuje wsadu Transact-SQL i natychmiast kończy pracę narzędzia SQLCMD bez zwracania wartości.
:EXIT()
Wykonuje wsad Transact-SQL i zaraz po wykonaniu kończy pracę narzędzia SQLCMD bez zwracania wartości.
:EXIT(zapytanie)
Wykonuje wsad włącznie z zapytaniem znajdującym się w nawiasie i zaraz po wykonaniu kończy pracę narzędzia SQLCMD bez zwracania wartości.
Jeżeli w skrypcie Transact-SQL wykonywanym w narzędziu SQLCMD znajdzie się wywołanie błędu ze stanem 127, narzędzie SQLCMD zakończy pracę zwracając komunikat błędu do klienta.

Rys. 6. Wywołanie błędu ze stanem 127 w narzędziu SQLCMD.
GO [count]
Oznacza zakończenie i wykonanie wsadu Transact-SQL. Po podaniu liczby całkowitej po słowie GO wsad zostanie uruchomiony tyle razy, ile wynosi podana liczba.
Słowo GO można zastąpić dowolnym słowem (patrz opcja –c narzędzia SQLCMD).
:r <filename>
Parsuje składnie Transact-SQL i polecenia narzędzia SQLCMD ze wskazanego pliku, wykonuje je i dodaje do listy zapamiętanych poleceń wykonanych w sesji narzędzia SQLCMD.
Jeżeli składnie w pliku nie są zakończone słowem GO (lub jego zamiennikiem), należy w następnej linii w narzędziu SQLCMD użyć słowa GO (lub jego zamiennika).
:Serverlist
Powoduje wylistowanie lokalnie skonfigurowanych serwerów (komputerów) i nazwy serwerów (komputerów) rozgłaszających w sieci.
Alternatywą dla tego polecenia jest opcja –L narzędzia SQLCMD.
:Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password]]
Powoduje podjęcie próby połączenia narzędzia SQLCMD z podaną instancją SQL Servera, a także zamknięcie bieżącego połączenia.
Opcja –l polecenia pozwala na ustalenie maksymalnego czasu oczekiwania na połączenie z serwerem, po którym zostanie wyświetlony komunikat błędu. Czas oczekiwania wyrażony jest w sekundach. Podanie wartości 0 oznacza nieskończony czas oczekiwania. Jeżeli opcja określająca czas oczekiwania nie zostanie użyta, czas oczekiwania jest określony przez zmienną skryptową SQLCMDTIMEOUT.
Jeżeli zostanie użyta opcja –U polecenia, wówczas użytkownik zostanie poproszony o podanie hasła, chyba że jest ustawiona któraś z dwóch zmiennych skryptowych: SQLCMDUSER lub SQLCMDPASSWORD.

Rys. 7. Zmiana połączenia w narzędziu SQLCMD.
[:] !!<command>
Wykonuje polecenia systemu operacyjnego.
| Informacja |
Polecenie jest wykonywane na komputerze, na którym jest uruchomione narzędzie SQLCMD. |

Rys. 8. Wykonanie polecenia systemu opracyjnego z poziomu narzędzia SQLCMD.
:XML [ ON | OFF ]
Przełącza formatowanie wyników na format XML i z powrotem na zwykły format tekstowy. Format XML jest doskonały do prezentowania wyników zapytań z klauzulą FOR XML.
:Help
Wyświetla listę poleceń wewnętrznych narzędzia SQLCMD wraz z krótkim opisem do każdego z nich.
SQL Server Management Studio umożliwia użytkownikowi pracę w trybie SQLCMD, w którym można umieszczać i uruchamiać w skryptach wykonywanych w tym programie niektórych wewnętrznych poleceń narzędzia SQLCMD.
Aby włączyć w Management Studio tryb SQLCMD, należy albo z menu głównego programu wybrać pozycję Query – SQLCMD Mode, albo kliknąć na odpowiedniej ikonie w pasku narzędziowym (patrz rysunek poniżej).

Rys. 9. Włączanie trybu SQLCMD w Management Studio.
| Informacja |
Wspieranie przez Management Studio polecenia wewnętrzne narzędzia SQLCMD można rozpoznać po tym, że w momencie wprowadzenia takiego polecenia linia jest oznaczana kolorem szarym. Należy też pamiętać, że narzędzie SQLCMD nawiązuje połączenia z SQL Serverem używając interfejsu OLE DB, zaś Management Studio do tego celu wykorzystuje klasę SqlClient z .NET Framework 2.0. Stąd wyniki działania w obydwu narzędziach mogą się od siebie różnić. |
SQLCMD jest bardzo dobrym narzędziem do zarządzania instancjami SQL Servera oraz do uruchamiania skryptów Transact-SQL z linii poleceń. Mnogość opcji w porównaniu do poprzedników tego narzędzia czyni z SQLCMD narzędzie mocne i wszechstronne. Dodane zmienne skryptowe oraz wewnętrzne polecenia usprawniają pracę administratora, a możliwość nawiązania dedykowanego połączenia administracyjnego rozwiązuje problem nieodpowiadającego (acz działającego) serwera. W moim odczuciu narzędzie SQLCMD to krok we właściwą stronę, jeśli chodzi o administrację serwerami baz danych z linii poleceń.
| • |
![]() | Paweł Potasiński (Microsoft Certified Trainer, Asseco Business Solutions S.A.) |