sqlcmd を使用する

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric SQL Database

sqlcmd は、Transact-SQL (T-SQL) ステートメントとスクリプトのアドホックな対話型実行のためのコマンド ライン ユーティリティです。 また、T-SQL スクリプト タスクも自動化します。 sqlcmd を対話形式で使用したり、sqlcmd のスクリプト ファイルをビルドしたりするには、T-SQL について理解しておく必要があります。 sqlcmd はさまざまな方法で使用できます。 例えば次が挙げられます。

  • コマンド ライン インターフェイス (CLI) から T-SQL ステートメントを入力します。 コンソールが結果を返します。

    Note

    Windows では、Windows 検索ボックスの cmd を使用してコマンド プロンプト ウィンドウを開き、 コマンド プロンプトを選択できます。 macOS と Linux では、組み込みのターミナル エミュレーターを使用できます。

    コンソールに sqlcmd 入力し、必要なオプションの一覧を入力し、 Enter キーを押します。 sqlcmd でサポートされるオプションの完全な一覧については、sqlcmd ユーティリティを参照してください。

  • 実行する T-SQL ステートメントを 1 つ指定するか、実行する T-SQL ステートメントの入ったテキスト ファイルをユーティリティに指定して、sqlcmd ジョブを送信します。 出力はテキスト ファイルに送られますが、コンソールに表示することもできます。

  • SQL Server Management Studio (SSMS) の SQLCMD モード。

  • SQL Server 管理オブジェクト (SMO)

  • SQL Server エージェントの CmdExec ジョブ

一般的な sqlcmd のオプション

  • サーバー オプション (-S) は、sqlcmd が接続する Microsoft SQL Server のインスタンスを指定します。

  • 認証オプション (-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 AdventureWorks2025.Person.Person"
    
  • Windows 認証を使用してローカル コンピューター上の既定のインスタンスに接続し、クエリを実行して、ファイルへの出力を指定し、クエリの完了後に sqlcmd を終了します。

    sqlcmd -Q "SELECT * FROM AdventureWorks2025.Person.Person" -o MyOutput.txt
    
  • SQL Server 認証を使用して名前付きインスタンスに接続し、sqlcmd からパスワードの入力を求めて T-SQL ステートメントを対話的に実行します。

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

    Tip

    sqlcmd ユーティリティでサポートされているオプションの一覧を表示するには、次を実行します: sqlcmd -?。

sqlcmd を使用して Transact-SQL ステートメントを対話的に実行する

sqlcmd ユーティリティを対話的に使用して、コンソールで T-SQL ステートメントを実行します。 sqlcmd を使用して対話的に T-SQL ステートメントを実行するには、入力ファイルまたはクエリを指定するための -Q、-q、-Z、または -i オプションを使用せずにこのユーティリティを実行します。 例えば次が挙げられます。

sqlcmd -S <ComputerName>\<InstanceName>

入力ファイルまたはクエリなしでコマンドを実行すると、 sqlcmd は指定された SQL Server インスタンスに接続します。 次に、 1> を含む新しい行と、 sqlcmd プロンプトという名前の点滅するアンダースコアが表示されます。 1 は、T-SQL ステートメントの最初の行であることを示します。この sqlcmd プロンプトが T-SQL ステートメントの入力開始位置になります。

sqlcmd プロンプトでは、T-SQL ステートメントと、 や GO などの EXIT コマンドの両方を入力できます。 各 T-SQL ステートメントは、ステートメント キャッシュと呼ばれるバッファーに入ります。 SQL Server GO GO コマンドを入力し、[Enter] キーを押すと、これらのステートメントが に送信されます。 sqlcmd を終了するには、新しい行の先頭で「EXIT」または「QUIT」と入力します。

ステートメント キャッシュをクリアするには、「:RESET」と入力します。 Ctrl+C と入力すると、sqlcmd が終了します。 + を使用して、 コマンドの後にステートメント キャッシュの実行を停止することもできます。

:ED プロンプトで コマンドを入力して、T-SQL ステートメントを編集します。 エディターが開き、T-SQL ステートメントを編集してエディターを閉じると、変更後の T-SQL ステートメントがコマンド ウィンドウに表示されます。 変更された T-SQL ステートメントを実行するには、「GO」と入力します。

引用符で囲まれた文字列

2 つの連続する引用符を入力して文字列に引用符を挿入できる点を除き、余分な前処理を行わずに引用符で囲まれた文字を使用できます。 SQL Server は、この文字の並びを 1 つの引用符として扱います (ただし、この変換はサーバーで行われます)。スクリプト変数が文字列内に存在する場合は展開されません。

例えば次が挙げられます。

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

結果セットは次のとおりです。

Length: 5" 7'

複数行の文字列

sqlcmd では、複数行の文字列がサポートされています。 たとえば、次の SELECT ステートメントは複数行にわたって記述されていますが、「GO」と入力してから [Enter] キーを押すと、1 つの文字列として実行されます。

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

対話的な sqlcmd の例

この例では、 sqlcmd を対話形式で実行したときに表示される内容を示します。

Windows でコンソール ウィンドウを開くと、次の例のような出力が表示されることがあります。

C:\Temp\>

この行は、 C:\Temp\ フォルダーが現在のフォルダーであることを意味します。 ファイル名を指定すると、オペレーティング システムはそのフォルダー内のファイルを検索します。

「sqlcmd」と入力して、ローカル コンピューター上の SQL Server の既定のインスタンスに接続します。 コンソール ウィンドウの内容は次のとおりです。

C:\Temp>sqlcmd
1>

この出力は、SQL Server のインスタンスに接続済みであるということです。 これで、sqlcmd は T-SQL ステートメントと sqlcmd コマンドを受け入れる準備ができました。 1>の後の点滅アンダースコアはsqlcmdプロンプトです。 入力したステートメントとコマンドが表示される場所を示します。 次に、「 USE AdventureWorks2025 」と入力し、 Enter キーを押します。 次に、「 GO 」と入力し、 Enter キーを押します。 本体の内容は次のとおりです。

sqlcmd
USE AdventureWorks2025;
GO

結果セットは次のとおりです。

Changed database context to 'AdventureWorks2025'.
1>

[Enter] キーを押すと、sqlcmd に新しい行が開始するように通知されます。 入力した後GO キーを押すと、sqlcmd が sql server のインスタンスにUSE AdventureWorks2025ステートメントを送信するように通知されます。 sqlcmd は、 USE ステートメントが正常に完了したことを示すメッセージを返します。 新しいステートメントまたはコマンドを入力するためのシグナルとして、新しい 1> プロンプトが表示されます。

次の例は、SELECT ステートメント、GOを実行するSELECT、EXIT を終了するを入力した場合のコンソールの内容を示しています。

USE AdventureWorks2025;
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 コマンドを入力し、Enter キーを 押します。

SQL Server コンテナーを作成してクエリする

sqlcmd (Go) を使用して、コンテナー内に SQL Server の新しいインスタンスを作成できます。 sqlcmd (Go) は、コンテナー イメージと SQL Server バックアップを指定する create ステートメントを公開します。 開発、デバッグ、分析の目的で SQL Server インスタンスをすばやく作成できます。

Important

Docker や Podman などのコンテナー ランタイムがインストールされている必要があります。

次のコマンドは、新しい SQL Server コンテナーを作成するために使用可能なすべてのオプションを表示する方法を示しています。

sqlcmd create mssql --help

次のコマンドは、最新バージョンの SQL Server 2025 (17.x) を使用して新しい SQL Server インスタンスを作成し、Wide World Importers サンプル データベースを復元します。

sqlcmd create mssql --accept-eula --tag 2025-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

次のコマンドは、作成したインスタンスへの接続に使用する接続文字列を一覧表示します。

sqlcmd config connection-strings

不要になったら、次のコマンドを使用してコンテナーを削除します。

sqlcmd delete

sqlcmd を使って Transact-SQL スクリプト ファイルを実行する

sqlcmd を使用してデータベース スクリプト ファイルを実行します。 スクリプト ファイルは、T-SQL ステートメント、sqlcmd コマンド、およびスクリプト変数が混在したテキスト ファイルです。 変数をスクリプト化する方法の詳細については、「スクリプト変数 で sqlcmd を使用する」を参照してください。 sqlcmd は、対話形式で入力するステートメントやコマンドと同様の方法で、スクリプト ファイル内のステートメント、コマンド、およびスクリプト変数と連携します。 sqlcmd が対話入力の場合と大きく異なる点は、ユーザーがステートメント、コマンド、およびスクリプト変数を入力するまで待機するのではなく、入力ファイルを最後まで中断することなく読み取るという点です。

データベース スクリプト ファイルは、さまざまな方法で作成できます。

  • SQL Server Management Studio で一連の T-SQL ステートメントを対話形式でビルドしてデバッグし、クエリ ウィンドウの内容をスクリプト ファイルとして保存します。

  • メモ帳などのテキスト エディターを使用して、T-SQL ステートメントを含むテキスト ファイルを作成します。

Examples

A. sqlcmd を使ってスクリプトを実行する

メモ帳を起動し、次の T-SQL ステートメントを入力します。

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

MyFolder というフォルダーを作成し、スクリプトを MyScript.sql ファイルとして C:\MyFolderフォルダーに保存します。 コンソールで次のコマンドを入力してスクリプトを実行し、MyFolder の MyOutput.txt で出力を実行します:

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

結果セットは次のとおりです。

Changed database context to 'AdventureWorks2025'.
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 AdventureWorks2025;
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 を使用して複数のインスタンスでコードを実行する

ファイル内の次のコードは、2 つのインスタンスに接続するスクリプトです。 2 番目のインスタンスへの接続の前に GO 注意してください。

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

F. XML 出力を返す

次の例は、XML 出力が書式設定されていない連続ストリームとして返される方法を示しています。

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

G. Windows スクリプト ファイルで sqlcmd を使う

などの sqlcmd -i C:\Temp\InputFile.txt -o C:\Temp\OutputFile.txt コマンドは、VBScript と共に.bat ファイルで実行できます。 このシナリオでは、対話型オプションを使用しないでください。 sqlcmd は、 .bat ファイルを実行するコンピューターにインストールする必要があります。

最初に、C:\Temp にある次の 4 つのファイルを作成します。

  • 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

H. sqlcmd を使って Azure SQL Database に対して暗号化を設定する

SQL Database データへの接続で sqlcmd を実行して、暗号化と証明書の信頼を指定できます。 次の 2 つの sqlcmd オプションを使用できます。

  • -N スイッチは、暗号化された接続に対するクライアント要求です。 このオプションは、ADO.NET オプションの ENCRYPT = trueと同等です。

  • -C スイッチは、サーバー証明書を暗黙的に信頼し、検証しないようにクライアントを構成します。 このオプションは、ADO.NET オプションの TRUSTSERVERCERTIFICATE = trueと同等です。

SQL Database サービスは、SQL Server インスタンスで使用できるすべての SET オプションをサポートするわけではありません。 次のオプションは、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 Native Client Provider の設定に以下が含まれる場合を示しています。

  • ForceProtocolEncryption = False
  • Trust Server Certificate = No

Windows 資格情報を使用して接続し、通信を暗号化する:

sqlcmd -E -N

Windows 資格情報を使用して接続し、サーバーの証明書を信頼する:

sqlcmd -E -C

Windows 資格情報を使用して接続し、通信を暗号化し、サーバー証明書を信頼します。

sqlcmd -E -N -C

次の構文の例は、SQL Server Native Client Provider の設定に以下が含まれる場合を示しています。

  • ForceProtocolEncryption = True
  • TrustServerCertificate = Yes

Windows 資格情報を使用して接続し、通信を暗号化し、サーバー証明書を信頼します。

sqlcmd -E

Windows 資格情報を使用して接続し、通信を暗号化し、サーバー証明書を信頼します。

sqlcmd -E -N

Windows 資格情報を使用して接続し、通信を暗号化し、サーバー証明書を信頼します。

sqlcmd -E -C

Windows 資格情報を使用して接続し、通信を暗号化し、サーバー証明書を信頼します。

sqlcmd -E -N -C

プロバイダーで ForceProtocolEncryption = True が指定されている場合、接続文字列で Encrypt=No が設定されていても暗号化が有効になります。