Udostępnij za pośrednictwem


Korzystanie z narzędzia sqlcmd

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Database w usłudze Microsoft Fabric

sqlcmd jest narzędziem wiersza polecenia do ad hoc, interakcyjnego wykonywania instrukcji i skryptów języka Transact-SQL (T-SQL) oraz automatyzowania zadań skryptów języka T-SQL. Aby użyć sqlcmd interaktywnie lub skompilować pliki skryptów dla sqlcmd, należy zrozumieć język T-SQL. Możesz użyć sqlcmd na różne sposoby. Na przykład:

  • Wprowadź instrukcje języka T-SQL w wierszu polecenia. Konsola zwraca wyniki. Aby otworzyć okno wiersza polecenia, wprowadź cmd w polu wyszukiwania systemu Windows i wybierz wiersza polecenia, aby otworzyć. W wierszu polecenia wpisz sqlcmd, a następnie listę żądanych opcji. Aby uzyskać pełną listę opcji obsługiwanych przez program sqlcmd, zobacz narzędzia sqlcmd.

  • Prześlij zadanie sqlcmd przez określenie pojedynczej instrukcji języka T-SQL do wykonania lub przez wskazanie narzędzia do pliku tekstowego zawierającego instrukcje języka T-SQL do wykonania. Dane wyjściowe są kierowane do pliku tekstowego, ale mogą być również wyświetlane w wierszu polecenia.

  • tryb SQLCMD w edytorze zapytań programu SQL Server Management Studio (SSMS).

  • Obiekty zarządzania programem SQL Server (SMO).

  • Zadania CmdExec agenta programu SQL Server.

Typowe opcje narzędzia sqlcmd

  • Opcja serwera (-S) identyfikuje wystąpienie programu SQL Server, z którym sqlcmd nawiązuje połączenie.

  • Opcje uwierzytelniania (-E, -Ui -P) określają poświadczenia, które sqlcmd używa do nawiązywania połączenia z wystąpieniem programu SQL Server.

    Notatka

    Opcja -E jest domyślna i nie musi być określona.

  • Opcje wejściowe (-Q, -qi -i) identyfikują lokalizację danych wejściowych sqlcmd.

  • Opcja danych wyjściowych (-o) określa plik, w którym sqlcmd ma umieścić dane wyjściowe.

Nawiązywanie połączenia z narzędziem sqlcmd

  • Połącz się z domyślną instancją używając uwierzytelnienia Windows, aby interaktywnie uruchamiać instrukcje T-SQL:

    sqlcmd -S <ComputerName>
    

    Uwaga

    W poprzednim przykładzie nie określono -E, ponieważ jest to ustawienie domyślne i sqlcmd nawiązuje połączenie z wystąpieniem domyślnym przy użyciu uwierzytelniania systemu Windows.

  • Nawiąż połączenie z nazwanym wystąpieniem, używając uwierzytelniania systemu Windows, aby interaktywnie wykonywać instrukcje T-SQL.

    sqlcmd -S <ComputerName>\<InstanceName>
    

    lub

    sqlcmd -S .\<InstanceName>
    
  • Nawiąż połączenie z nazwanym wystąpieniem przy użyciu uwierzytelniania systemu Windows i określ pliki wejściowe i wyjściowe:

    sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
    
  • Połącz się z wystąpieniem domyślnym na komputerze lokalnym przy użyciu uwierzytelniania systemu Windows, wykonaj zapytanie i zachowaj sqlcmd uruchomione po zakończeniu zapytania:

    sqlcmd -q "SELECT * FROM AdventureWorks2022.Person.Person"
    
  • Połącz się z wystąpieniem domyślnym na komputerze lokalnym przy użyciu uwierzytelniania systemu Windows, wykonaj zapytanie, przekierowuj dane wyjściowe do pliku i zamknij sqlcmd po zakończeniu zapytania:

    sqlcmd -Q "SELECT * FROM AdventureWorks2022.Person.Person" -o MyOutput.txt
    
  • Nawiąż połączenie z nazwanym wystąpieniem przy użyciu uwierzytelniania SQL Server, aby interaktywnie uruchomić instrukcje języka T-SQL, z sqlcmd proszącym o podanie hasła:

    sqlcmd -U MyLogin -S <ComputerName>\<InstanceName>
    

    Napiwek

    Aby wyświetlić listę opcji obsługiwanych przez narzędzie sqlcmd uruchom polecenie: sqlcmd -?.

Uruchamianie instrukcji Transact-SQL interaktywnie przy użyciu narzędzia sqlcmd

Możesz użyć narzędzia sqlcmd interaktywnie do wykonywania instrukcji języka T-SQL w oknie wiersza polecenia. Aby interaktywnie wykonywać instrukcje języka T-SQL przy użyciu sqlcmd, uruchom narzędzie bez użycia -Q, -q, -Zlub -i opcji określania dowolnych plików wejściowych lub zapytań. Na przykład:

sqlcmd -S <ComputerName>\<InstanceName>

Gdy polecenie jest wykonywane bez plików wejściowych lub zapytań, sqlcmd nawiązuje połączenie z określonym wystąpieniem programu SQL Server, a następnie wyświetla nowy wiersz z 1>, po którym następuje migający podkreślnik zwany sqlcmd monitu. 1 oznacza, że jest to pierwszy wiersz instrukcji T-SQL, a monit sqlcmd jest punktem, w którym instrukcja T-SQL rozpoczyna się, gdy ją wprowadzasz.

W wierszu polecenia sqlcmd można wpisać zarówno instrukcje języka T-SQL, jak i polecenia sqlcmd, takie jak GO i EXIT. Każda instrukcja języka T-SQL jest umieszczana w buforze nazywanym pamięcią podręczną instrukcji. Te instrukcje są wysyłane do programu SQL Server po wpisaniu polecenia GO i naciśnięciu Enter. Aby zakończyć sqlcmd, wpisz EXIT lub QUIT na początku nowego wiersza.

Aby wyczyścić pamięć podręczną instrukcji SQL, wpisz :RESET. Wpisanie Ctrl+C powoduje zamknięcie sqlcmd. Ctrl+C można również użyć do zatrzymania wykonywania buforu poleceń po wydaniu polecenia GO.

Instrukcje języka T-SQL wprowadzone w sesji interakcyjnej można edytować, wprowadzając polecenie :ED i wiersz sqlcmd. Edytor zostanie otwarty i po edycji instrukcji T-SQL i zamknięciu edytora poprawiona instrukcja języka T-SQL zostanie wyświetlona w oknie polecenia. Wprowadź GO, aby uruchomić poprawioną instrukcję języka T-SQL.

Ciągi cytowane

Znaki ujęte w cudzysłów są używane bez dodatkowego przetwarzania wstępnego, z wyjątkiem tego, że znaki cudzysłowu można wstawić do ciągu, wprowadzając dwa kolejne cudzysłowy. Program SQL Server traktuje tę sekwencję znaków jako jeden cudzysłów. (Jednak tłumaczenie odbywa się na serwerze). Zmienne skryptowe nie są rozszerzane, gdy pojawiają się w ciągu.

Na przykład:

sqlcmd
PRINT "Length: 5"" 7'";
GO

Oto zestaw wyników.

Length: 5" 7'

Ciągi obejmujące wiele wierszy

sqlcmd obsługuje ciągi obejmujące wiele wierszy. Na przykład następująca instrukcja SELECT obejmuje wiele wierszy, ale jest wykonywana jako pojedynczy ciąg po wpisaniu GO, a następnie naciśnij Enter.

SELECT <First line>
FROM <Second line>
WHERE <Third line>;
GO

Przykład interakcyjnego polecenia sqlcmd

Jest to przykład tego, co widzisz po uruchomieniu sqlcmd interaktywnie.

Po otwarciu okna wiersza polecenia istnieje jeden wiersz podobny do następującego:

C:\Temp\>

Oznacza to, że folder C:\Temp\ jest bieżącym folderem, a jeśli określisz nazwę pliku, system Windows szuka pliku w tym folderze.

Wpisz sqlcmd, aby nawiązać połączenie z domyślnym wystąpieniem programu SQL Server na komputerze lokalnym, a zawartość okna wiersza polecenia jest przedstawiona poniżej:

C:\Temp>sqlcmd
1>

Oznacza to, że nawiązano połączenie z wystąpieniem programu SQL Server i sqlcmd jest teraz gotowe do akceptowania instrukcji języka T-SQL oraz poleceń sqlcmd . Migające podkreślenie po 1> to monit sqlcmd, który oznacza lokalizację, w której są wyświetlane wpisywane instrukcje i polecenia. Teraz wpisz USE AdventureWorks2022 i naciśnij Enter, a następnie wpisz GO i naciśnij Enter. Zawartość okna wiersza polecenia jest następująca:

sqlcmd
USE AdventureWorks2022;
GO

Oto zestaw wyników.

Changed database context to 'AdventureWorks2022'.
1>

Po naciśnięciu Enterprogram sygnalizuje sqlcmd, aby rozpocząć nowy wiersz. Naciśnięcie Enter po wpisaniu GOsygnalizuje sqlcmd, aby wysłać instrukcję USE AdventureWorks2022 do wystąpienia serwera SQL Server. sqlcmd następnie zwraca komunikat wskazujący, że instrukcja USE została ukończona pomyślnie i wyświetla nowy monit 1> jako sygnał, aby wprowadzić nową instrukcję lub polecenie.

W poniższym przykładzie pokazano, co zawiera okno wiersza polecenia, jeśli wpiszesz instrukcję SELECT, GO aby wykonać SELECTi EXIT aby zakończyć sqlcmd:

USE AdventureWorks2022;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO

Oto zestaw wyników.

BusinessEntityID  FirstName  LastName
----------------- ---------- ------------
1                 Syed       Abbas
2                 Catherine  Abel
3                 Kim        Abercrombie

Po wygenerowaniu danych wyjściowych sqlcmd resetuje monit sqlcmd i wyświetla 1>. Wpisz EXIT w wierszu polecenia 1>, aby zakończyć sesję. Możesz teraz zamknąć okno wiersza polecenia, wpisując inne polecenie EXIT.

Tworzenie i wykonywanie zapytań względem kontenera programu SQL Server

Możesz użyć sqlcmd (Go), aby utworzyć nowe wystąpienie programu SQL Server w kontenerze. sqlcmd (Go) uwidacznia instrukcję create, która umożliwia określenie obrazu kontenera i kopii zapasowej programu SQL Server w celu szybkiego utworzenia wystąpienia programu SQL Server na potrzeby programowania, debugowania i analizy.

Ważny

Potrzebujesz zainstalowanego środowiska uruchomieniowego kontenera, takiego jak dockerlub Podman.

Następujące polecenie pokazuje, jak wyświetlić wszystkie dostępne opcje tworzenia nowego kontenera programu SQL Server:

sqlcmd create mssql --help

Następujące polecenie tworzy nowe wystąpienie programu SQL Server przy użyciu najnowszej wersji programu SQL Server 2022 (16.x), a następnie przywraca przykładową bazę danych Wide World Importers:

sqlcmd create mssql --accept-eula --tag 2022-latest --using https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak

Po utworzeniu wystąpienia programu SQL Server można użyć sqlcmd (Go), aby zarządzać nim i wykonywać względem niego zapytania.

Następujące polecenie potwierdza wersję wystąpienia, które zostało utworzone:

sqlcmd query "SELECT @@version"

Następujące polecenie uruchamia interaktywną sesję z wystąpieniem, które zostało utworzone:

sqlcmd query

Następujące polecenie otwiera narzędzie Azure Data Studio i łączy się automatycznie z bazą danych przywróconą podczas procesu tworzenia:

sqlcmd open ads

Następujące polecenie wyświetla listę parametrów połączenia, które mają być używane do nawiązywania połączenia z utworzonym wystąpieniem:

sqlcmd config connection-strings

Następujące polecenie służy do usuwania kontenera, gdy nie jest już potrzebny:

sqlcmd delete

Uruchamianie plików skryptów Transact-SQL przy użyciu narzędzia sqlcmd

Do wykonywania plików skryptów bazy danych można użyć sqlcmd. Pliki skryptów to pliki tekstowe, które zawierają kombinację instrukcji języka T-SQL, polecenia sqlcmd i zmiennych skryptowych. Aby uzyskać więcej informacji na temat tego, jak skryptować zmienne, zobacz Użyj sqlcmd z zmiennymi skryptowymi. sqlcmd współdziała z instrukcjami, poleceniami i zmiennymi skryptowymi w pliku skryptu w sposób podobny do sposobu działania z instrukcjami i poleceniami wprowadzanymi interaktywnie. Główną różnicą jest to, że sqlcmd odczytuje z pliku wejściowego bez zatrzymywania się, zamiast czekać, aż użytkownik wprowadzi instrukcje, polecenia i zmienne skryptowe.

Istnieją różne sposoby tworzenia plików skryptów bazy danych:

  • Możesz interaktywnie skompilować i debugować zestaw instrukcji języka T-SQL w programie SQL Server Management Studio, a następnie zapisać zawartość okna Zapytania jako plik skryptu.

  • Plik tekstowy zawierający instrukcje języka T-SQL można utworzyć przy użyciu edytora tekstów, takiego jak Notatnik.

Przykłady

A. Uruchamianie skryptu przy użyciu narzędzia sqlcmd

Uruchom Notatnik i wpisz następujące instrukcje języka T-SQL:

USE AdventureWorks2022;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO

Utwórz folder o nazwie MyFolder, a następnie zapisz skrypt jako plik MyScript.sql w folderze C:\MyFolder. Wprowadź następujące polecenie w wierszu polecenia, aby uruchomić skrypt i umieścić dane wyjściowe w MyOutput.txt w MyFolder:

sqlcmd -i C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt

Oto zestaw wyników.

Changed database context to 'AdventureWorks2022'.
BusinessEntityID  FirstName  LastName
----------------- ---------- ------------
1                 Syed       Abbas
2                 Catherine  Abel
3                 Kim        Abercrombie
(3 rows affected)

B. Używanie narzędzia sqlcmd z dedykowanym połączeniem administracyjnym

W poniższym przykładzie sqlcmd służy do nawiązywania połączenia z serwerem, który ma problem z blokowaniem przy użyciu dedykowanego połączenia administratora (DAC).

C:\Temp\>sqlcmd -S ServerName -A
1> SELECT session_id, blocking_session_id FROM `sys.dm_exec_requests` WHERE blocking_session_id <> 0;
2> GO

Oto zestaw wyników.

session_id   blocking_session_id
-----------  --------------------`
62           64
(1 rows affected)

Aby zakończyć proces blokowania, użyj sqlcmd.

1> KILL 64;
2> GO

C. Wykonywanie procedury składowanej przy użyciu narzędzia sqlcmd

W poniższym przykładzie pokazano, jak wykonać procedurę składowaną przy użyciu sqlcmd. Utwórz następującą procedurę składowaną.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.ContactEmailAddress', 'P') IS NOT NULL
    DROP PROCEDURE dbo.ContactEmailAddress;
GO

CREATE PROCEDURE dbo.ContactEmailAddress (
    @FirstName NVARCHAR(50),
    @LastName NVARCHAR(50)
)
AS
SET NOCOUNT ON;

SELECT EmailAddress
FROM Person.Person
WHERE FirstName = @FirstName
    AND LastName = @LastName;

SET NOCOUNT OFF;
GO

Na monicie sqlcmd wprowadź następujące:

C:\Temp\sqlcmd
1> :Setvar FirstName Gustavo
1> :Setvar LastName Achong
1> EXEC dbo.ContactEmailAddress $(FirstName),$(LastName)
2> GO
EmailAddress
-----------------------------
gustavo0@adventure-works.com

D. Używanie narzędzia sqlcmd do konserwacji bazy danych

W poniższym przykładzie pokazano, jak używać sqlcmd dla zadania konserwacji bazy danych. Utwórz C:\Temp\BackupTemplate.sql przy użyciu następującego kodu.

USE master;
BACKUP DATABASE [$(db)] TO DISK='$(bakfile)';

Na wierszu polecenia sqlcmd wprowadź następujący kod:

C:\Temp\>sqlcmd
1> :connect <server>
Sqlcmd: Successfully connected to server <server>.
1> :setvar db msdb
1> :setvar bakfile C:\Temp\msdb.bak
1> :r C:\Temp\BackupTemplate.sql
2> GO
Changed database context to 'master'.
Processed 688 pages for database 'msdb', file 'MSDBData' on file 2.
Processed 5 pages for database 'msdb', file 'MSDBLog' on file 2.
BACKUP DATABASE successfully processed 693 pages in 0.725 seconds (7.830 MB/sec)

E. Wykonywanie kodu w wielu wystąpieniach przy użyciu narzędzia sqlcmd

Poniższy kod w pliku przedstawia skrypt, który łączy się z dwoma wystąpieniami. Zwróć uwagę na GO przed połączeniem z drugim wystąpieniem.

:CONNECT <server>\,<instance1>
EXEC dbo.SomeProcedure
GO
:CONNECT <server>\,<instance2>
EXEC dbo.SomeProcedure
GO

E. Zwracanie danych wyjściowych XML

W poniższym przykładzie pokazano, jak dane wyjściowe XML są zwracane niesformatowane w strumieniu ciągłym.

C:\Temp\>sqlcmd -d AdventureWorks2022
1> :XML ON
1> SELECT TOP 3 FirstName + ' ' + LastName + ', '
2> FROM Person.Person
3> GO
Syed Abbas, Catherine Abel, Kim Abercrombie,

F. Używanie narzędzia sqlcmd w pliku skryptu systemu Windows

Polecenie sqlcmd, takie jak sqlcmd -i C:\Temp\InputFile.txt -o C:\Temp\OutputFile.txt,, można wykonać w pliku .bat razem z językiem VBScript. W takim przypadku nie używaj opcji interaktywnych. sqlcmd należy zainstalować na komputerze, na którym jest wykonywany plik .bat.

Najpierw utwórz następujące cztery pliki w C:\Temp:

  • C:\Temp\badscript.sql

    SELECT batch_1_this_is_an_error
    GO
    SELECT 'batch #2'
    GO
    
  • C:\Temp\goodscript.sql

    SELECT 'batch #1';
    GO
    SELECT 'batch #2';
    GO
    
  • C:\Temp\returnvalue.sql

    :exit(select 100)
    
  • C:\Temp\windowsscript.bat

    @echo off
    
    echo Running badscript.sql
    sqlcmd -i badscript.sql -b -o out.log
    if not errorlevel 1 goto next1
    echo == An error occurred
    
    :next1
    
    echo Running goodscript.sql
    sqlcmd -i goodscript.sql -b -o out.log
    if not errorlevel 1 goto next2
    echo == An error occurred
    
    :next2
    echo Running returnvalue.sql
    sqlcmd -i returnvalue.sql -o out.log
    echo SQLCMD returned %errorlevel% to the command shell
    
    :exit
    

Następnie w wierszu polecenia uruchom polecenie C:\Temp\windowsscript.bat:

C:\Temp\>windowsscript.bat
Running badscript.sql
== An error occurred
Running goodscript.sql
Running returnvalue.sql

SQLCMD returned 100 to the command shell

G. Ustawianie szyfrowania w usłudze Azure SQL Database przy użyciu narzędzia sqlcmd

sqlcmd można wykonać na połączeniu z usługą SQL Database, aby określić szyfrowanie i zaufanie certyfikatom. Dostępne są dwie opcje sqlcmd:

  • Przełącznik -N jest używany przez klienta do żądania zaszyfrowanego połączenia. Ta opcja jest odpowiednikiem opcji ADO.net ENCRYPT = true.

  • Przełącznik -C jest używany przez klienta do skonfigurowania go w taki sposób, aby domyślnie ufał certyfikatowi serwera i go nie weryfikował. Ta opcja jest odpowiednikiem opcji ADO.net TRUSTSERVERCERTIFICATE = true.

Usługa SQL Database nie obsługuje wszystkich opcji SET dostępnych w wystąpieniu programu SQL Server. Następujące opcje zgłaszają błąd, gdy odpowiednia opcja SET jest ustawiona na ON lub OFF:

  • SET ANSI_DEFAULTS
  • SET ANSI_NULLS
  • SET REMOTE_PROC_TRANSACTIONS
  • SET ANSI_NULL_DEFAULT

Następujące opcje SET nie zgłaszają wyjątków, ale nie można ich używać. Są przestarzałe:

  • SET CONCAT_NULL_YIELDS_NULL
  • SET ANSI_PADDING
  • SET QUERY_GOVERNOR_COST_LIMIT

Składnia

Poniższe przykłady odnoszą się do przypadków, w których ustawienia dostawcy klienta natywnego programu SQL Server obejmują:

  • ForceProtocolEncryption = False
  • Trust Server Certificate = No

Połącz się przy użyciu poświadczeń systemu Windows i szyfruj komunikację:

sqlcmd -E -N

Nawiąż połączenie przy użyciu poświadczeń systemu Windows i certyfikatu serwera zaufania:

sqlcmd -E -C

Nawiąż połączenie przy użyciu poświadczeń systemu Windows, szyfruj certyfikat komunikacji i serwera zaufania:

sqlcmd -E -N -C

Poniższe przykłady odnoszą się do przypadków, w których ustawienia dostawcy klienta natywnego programu SQL Server obejmują:

  • ForceProtocolEncryption = True
  • TrustServerCertificate = Yes

Nawiąż połączenie przy użyciu poświadczeń systemu Windows, szyfruj certyfikat komunikacji i serwera zaufania:

sqlcmd -E

Nawiąż połączenie przy użyciu poświadczeń systemu Windows, szyfruj certyfikat komunikacji i serwera zaufania:

sqlcmd -E -N

Nawiąż połączenie przy użyciu poświadczeń systemu Windows, szyfruj certyfikat komunikacji i serwera zaufania:

sqlcmd -E -C

Nawiąż połączenie przy użyciu poświadczeń systemu Windows, szyfruj certyfikat komunikacji i serwera zaufania:

sqlcmd -E -N -C

Jeśli dostawca określi ForceProtocolEncryption = True, szyfrowanie jest włączone, nawet jeśli w parametrach połączenia znajduje się Encrypt=No.