Поделиться через


Используйте sqlcmd

Относится к:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsАналитическая платформа (PDW)SQL база данных в Microsoft Fabric

sqlcmd — это служебная программа командной строки для нерегламентированного интерактивного выполнения инструкций и сценариев Transact-SQL (T-SQL) и автоматизации задач сценариев T-SQL. Чтобы использовать sqlcmd в интерактивном режиме или создавать файлы скриптов для sqlcmd, следует понимать T-SQL. Sqlcmd можно использовать различными способами. Рассмотрим пример.

  • Введите инструкции T-SQL из командной строки. Консоль возвращает результаты. Чтобы открыть окно командной строки, введите cmd в поле поиска Windows и выберите командную строку , чтобы открыть ее. В окне командной строки введите sqlcmd, а затем список необходимых параметров. Полный список параметров, поддерживаемых sqlcmd, см. в разделе утилита sqlcmd.

  • Отправьте задание sqlcmd либо путем указания одной инструкции T-SQL для выполнения, либо путем указания служебной программы в текстовый файл, содержащий инструкции T-SQL для выполнения. Выходные данные направляются в текстовый файл, но также могут отображаться в командной строке.

  • Режим SQLCMD в среде SQL Server Management Studio (SSMS) в редакторе запросов.

  • Объекты управления SQL Server (SMO).

  • Задания CmdExec агента SQL Server.

Распространенные параметры sqlcmd

  • Параметр сервера (-S) определяет экземпляр SQL Server, к которому подключается sqlcmd .

  • Параметры проверки подлинности (-Eи-U-P) указывают учетные данные, которые sqlcmd использует для подключения к экземпляру SQL Server.

    Note

    -E Параметр по умолчанию и не требуется указывать.

  • Параметры ввода (-Q, -qи -i) определяют расположение входных данных в sqlcmd.

  • Параметр вывода (-o) указывает файл, в который sqlcmd помещает свои выходные данные.

Подключение к программе sqlcmd

  • Подключитесь к экземпляру по умолчанию с помощью проверки подлинности Windows, чтобы интерактивно выполнять запросы T-SQL.

    sqlcmd -S <ComputerName>
    

    Note

    В предыдущем примере -E не указано, так как это значение по умолчанию, и sqlcmd подключается к экземпляру по умолчанию, используя аутентификацию Windows.

  • Подключитесь к именованному экземпляру с помощью аутентификации Windows для интерактивного выполнения инструкций T-SQL.

    sqlcmd -S <ComputerName>\<InstanceName>
    

    or

    sqlcmd -S .\<InstanceName>
    
  • Подключитесь к именованному экземпляру с помощью проверки подлинности Windows и укажите входные и выходные файлы:

    sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
    
  • Подключитесь к экземпляру по умолчанию на локальном компьютере с проверкой подлинности Windows, выполните запрос и оставьте sqlcmd запущенным после завершения запроса.

    sqlcmd -q "SELECT * FROM AdventureWorks2022.Person.Person"
    
  • Подключитесь к экземпляру по умолчанию на локальном компьютере с проверкой подлинности Windows, выполните запрос, перенаправите выходные данные в файл и закройте sqlcmd после завершения запроса:

    sqlcmd -Q "SELECT * FROM AdventureWorks2022.Person.Person" -o MyOutput.txt
    
  • Подключитесь к именованному экземпляру, используя проверку подлинности SQL Server для интерактивного запуска инструкций T-SQL с запросом от sqlcmd на ввод пароля.

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

    Tip

    Для просмотра полного перечня параметров, поддерживаемых служебной программой sqlcmd , введите sqlcmd -?.

Интерактивный запуск инструкций Transact-SQL с помощью программы sqlcmd

Программу sqlcmd можно использовать интерактивно для выполнения инструкций T-SQL в окне командной строки. Для интерактивного выполнения инструкций T-SQL с помощью sqlcmd запустите программу без использования -Q, -q-Zили -i параметров, чтобы указать входные файлы или запросы. Рассмотрим пример.

sqlcmd -S <ComputerName>\<InstanceName>

Если команда выполняется без входных файлов или запросов, sqlcmd подключается к указанному экземпляру SQL Server, а затем отображает новую строку с мигающим символом подчеркивания, 1> который называется приглашением sqlcmd. Первая строка инструкции T-SQL обозначается символом 1, а ввод команды начинается с приглашения sqlcmd, с которого начинается инструкция T-SQL при ее вводе.

В командной строке sqlcmd можно вводить инструкции T-SQL и команды sqlcmd, например GO и EXIT. Каждая инструкция T-SQL помещается в буфер, называемый кэшем инструкций. Эти выражения отправляются на SQL Server после ввода команды GO и нажатия клавиши ВВОД. Чтобы выйти из sqlcmd, введите EXIT или QUIT в начале новой строки.

Чтобы очистить кэш инструкций, введите :RESET. Нажатие сочетания клавиш Ctrl+C завершает работу sqlcmd. Ctrl+C также можно использовать для остановки выполнения кэша инструкций после GO выдачи команды.

Инструкции T-SQL, введенные в интерактивном сеансе, можно изменить, введя :ED команду и запрос sqlcmd . Редактор откроется и после редактирования инструкции T-SQL и закрытия редактора в командном окне появится измененная инструкция T-SQL. Введите GO , чтобы запустить измененную инструкцию T-SQL.

Строки с кавычками

Символы, заключенные в кавычки, используются без какой-либо дополнительной предварительной обработки, за исключением того, что кавычки можно вставить в строку, введя две последовательные кавычки. SQL Server обрабатывает эту последовательность символов как одну кавычку. (Однако перевод происходит на сервере.) Переменные скрипта не расширяются, когда они появляются внутри строки.

Рассмотрим пример.

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

Вот набор результатов.

Length: 5" 7'

Многострочные строки

sqlcmd поддерживает строки, охватывающие несколько строк. Например, следующая SELECT инструкция охватывает несколько строк, но выполняется как одна строка после ввода GO и нажмите клавишу ВВОД.

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

Пример использования интерактивного sqlcmd

Ниже приведен пример интерактивного выполнения программы sqlcmd .

При открытии окна командной строки есть одна строка, аналогичная следующей:

C:\Temp\>

Это означает, что папка C:\Temp\ является текущей папкой, и если указать имя файла, Windows ищет файл в этой папке.

Введите sqlcmd для подключения к экземпляру SQL Server по умолчанию на локальном компьютере, а содержимое окна командной строки выглядит следующим образом:

C:\Temp>sqlcmd
1>

Это означает, что вы подключились к экземпляру SQL Server и sqlcmd теперь готовы принять инструкции T-SQL и команды sqlcmd . Мигающий знак подчеркивания после 1> — это приглашение sqlcmd, которое указывает на место, где отображаются оператор и команды, которые вы вводите. Теперь введите USE AdventureWorks2022 и нажмите клавишу ВВОД, а затем введите GO и нажмите клавишу ВВОД. Содержимое окна командной строки выглядит следующим образом:

sqlcmd
USE AdventureWorks2022;
GO

Вот набор результатов.

Changed database context to 'AdventureWorks2022'.
1>

При нажатии клавиши ВВОД он сигнализирует sqlcmd о запуске новой строки. Нажатие клавиши ВВОД после ввода GO сигнализирует sqlcmd отправить USE AdventureWorks2022 инструкцию на экземпляр SQL Server. Затем sqlcmd возвращает сообщение, указывающее, что USE инструкция успешно завершена, и отображает новую 1> строку в качестве сигнала для ввода новой инструкции или команды.

В следующем примере показано, что содержит окно командной строки, если ввести SELECT команду, GO для выполнения SELECT, и EXIT для выхода из sqlcmd:

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

Вот набор результатов.

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

После создания выходных данных sqlcmd сбрасывает подсказку команды sqlcmd и отображает 1>. Введите EXIT в командной строке 1>, чтобы выйти из сеанса. Теперь можно закрыть окно командной строки. Для этого введите еще одну команду EXIT .

Создание и запрос контейнера SQL Server

Для создания нового экземпляра SQL Server в контейнере можно использовать sqlcmd (Go). sqlcmd (Go) предоставляет create инструкцию, которая позволяет указать образ контейнера и резервное копирование SQL Server, чтобы быстро создать экземпляр SQL Server для разработки, отладки и анализа.

Important

Требуется установленная среда выполнения контейнера, например Docker или Podman.

В следующей команде показано, как просмотреть все доступные параметры для создания нового контейнера SQL Server:

sqlcmd create mssql --help

Следующая команда создает новый экземпляр SQL Server с помощью последней версии SQL Server 2022 (16.x), а затем восстанавливает образец базы данных 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

После создания экземпляра SQL Server можно использовать sqlcmd (Go) для управления и запроса.

Чтобы подтвердить версию созданного экземпляра, используйте следующую команду:

sqlcmd query "SELECT @@version"

Следующая команда запускает интерактивный сеанс с созданным экземпляром:

sqlcmd query

Следующая команда открывает Azure Data Studio и автоматически подключается к базе данных, восстановленной во время создания:

sqlcmd open ads

Следующая команда перечисляет строки подключения, которые будут использоваться для подключения к созданному экземпляру.

sqlcmd config connection-strings

Следующая команда используется для удаления контейнера, если он больше не нужен:

sqlcmd delete

Выполнение файлов скриптов Transact-SQL с помощью sqlcmd

Вы можете использовать программу sqlcmd для выполнения файлов скриптов базы данных. Файлы скриптов — это текстовые файлы, содержащие сочетание инструкций T-SQL, команд sqlcmd и переменных скриптов. Дополнительные сведения о том, как использовать переменные в скриптах, см. в разделе Использование sqlcmd с переменными скриптов. Программаsqlcmd работает с инструкциями, командами и переменными скрипта, помещенными в файл скрипта, подобно тому как она работает с инструкциями и командами, вводимыми в интерактивном режиме. Главное отличие заключается в том, что программа sqlcmd без остановок считывает входной файл, а не ждет, пока пользователь введет инструкции, команды или переменные скрипта.

Существуют различные способы создания файлов скрипта базы данных:

  • Вы можете интерактивно создавать и отлаживать набор инструкций T-SQL в SQL Server Management Studio, а затем сохранять содержимое окна запроса в виде файла скрипта.

  • Текстовый файл, содержащий инструкции T-SQL, можно создать с помощью текстового редактора, например Блокнота.

Examples

A. Запуск скрипта с помощью sqlcmd

Запустите Блокнот и введите следующие инструкции T-SQL:

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

Создайте папку с именем MyFolder и сохраните скрипт в виде файла MyScript.sql в папке C:\MyFolder. Введите следующую команду в командной строке, чтобы запустить скрипт и поместить выходные данные в MyOutput.txtMyFolder:

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

Вот набор результатов.

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

B. Использование sqlcmd с выделенным административным подключением

В следующем примере sqlcmd используется для подключения к серверу с блокировкой с помощью выделенного подключения администратора (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

Вот набор результатов.

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

Используйте sqlcmd , чтобы завершить процесс блокировки.

1> KILL 64;
2> GO

C. Использование sqlcmd для выполнения хранимой процедуры

В следующем примере показано, как выполнить хранимую процедуру с помощью sqlcmd. Создайте следующую хранимую процедуру.

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

В командной строке sqlcmd введите следующее:

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. Использование sqlcmd для обслуживания базы данных

В следующем примере показано, как использовать sqlcmd для задачи обслуживания базы данных. Создайте C:\Temp\BackupTemplate.sql со следующим кодом.

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

В командной строке sqlcmd введите следующий код:

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. Использование sqlcmd для выполнения кода на нескольких экземплярах

Код в файле ниже показывает скрипт, который подключается к двум экземплярам. Обратите внимание на команду GO перед подключением ко второму экземпляру.

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

E. Возврат выходных данных XML

Следующий пример показывает, как выходные данные XML возвращаются неформатированными, в виде непрерывного потока.

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. Использование sqlcmd в файле скрипта Windows

Команда sqlcmd , например sqlcmd -i C:\Temp\InputFile.txt -o C:\Temp\OutputFile.txt, , может выполняться в файле .bat вместе с VBScript. В этом случае не используйте интерактивные параметры. Программаsqlcmd должна быть установлена на компьютере, на котором выполняется BAT-файл.

Сначала создайте следующие четыре файла в 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
    

Затем из командной строки запустите 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. Использование sqlcmd для задания шифрования в База данных SQL Azure

sqlcmd можно выполнять при подключении к данным базы данных SQL, чтобы указать шифрование и доверие к сертификатам. Доступны два варианта sqlcmd :

  • Параметр -N используется клиентом для запроса зашифрованного подключения. Этот параметр аналогичен параметру ADO.net ENCRYPT = true.

  • Параметр -C используется клиентом для его настройки, чтобы он неявно доверял сертификату сервера и не проверял его. Этот параметр аналогичен параметру ADO.net TRUSTSERVERCERTIFICATE = true.

Служба базы данных SQL не поддерживает все параметры SET, которые доступны в экземпляре SQL Server. Следующие параметры вызывают ошибку, если соответствующий параметр SET имеет значение ON или OFF:

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

Следующие параметры SET не вызывают исключений, но не могут использоваться. Они устарели:

  • SET CONCAT_NULL_YIELDS_NULL
  • SET ANSI_PADDING
  • SET QUERY_GOVERNOR_COST_LIMIT

Syntax

В следующих примерах приведены случаи, когда параметры поставщика собственных клиентов SQL Server включают:

  • ForceProtocolEncryption = False
  • Trust Server Certificate = No

Подключение с использованием учетных данных Windows и шифрование соединения:

sqlcmd -E -N

Подключение с использованием учетных данных Windows и доверие сертификату сервера:

sqlcmd -E -C

Подключение с использованием учетных данных Windows, шифрование соединения и доверие сертификату сервера:

sqlcmd -E -N -C

В следующих примерах приведены случаи, когда параметры поставщика собственных клиентов SQL Server включают:

  • ForceProtocolEncryption = True
  • TrustServerCertificate = Yes

Подключение с использованием учетных данных Windows, шифрование соединения и доверие сертификату сервера:

sqlcmd -E

Подключение с использованием учетных данных Windows, шифрование соединения и доверие сертификату сервера:

sqlcmd -E -N

Подключение с использованием учетных данных Windows, шифрование соединения и доверие сертификату сервера:

sqlcmd -E -C

Подключение с использованием учетных данных Windows, шифрование соединения и доверие сертификату сервера:

sqlcmd -E -N -C

Если поставщик указывает ForceProtocolEncryption = True, шифрование включено, даже если Encrypt=No в строке подключения.