次の方法で共有


sqlcmd を使用する

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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

  • コマンド プロンプトから T-SQL ステートメントを入力します。 コンソールが結果を返します。 コマンド プロンプト ウィンドウを開くには、Windows の検索ボックスに「cmd」と入力し、[コマンド プロンプト] を選んで開きます。 コマンド プロンプトで「sqlcmd」と入力し、その後に必要なオプションのリストを入力します。 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>
    

    または

    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 認証を使用して名前付きインスタンスに接続し、sqlcmd からパスワードの入力を求めて T-SQL ステートメントを対話的に実行します。

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

    ヒント

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

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

対話型セッションで入力された T-SQL ステートメントは、:ED コマンドと sqlcmd プロンプトを入力すると編集できます 起動したエディターで 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 を対話的に実行する例を次に示します。

コマンド プロンプト ウィンドウを開くと、次のような行が表示されます。

C:\Temp\>

これは、フォルダー C:\Temp\ が現在のフォルダーであり、ファイル名を指定すると Windows によってそのフォルダー内のファイルが検索されることを意味します。

sqlcmd と入力して、ローカル コンピューターの SQL Server の既定のインスタンスに接続します。コマンド プロンプト ウィンドウの内容は次のようになります。

C:\Temp>sqlcmd
1>

これは、SQL Server インスタンスへの接続が確立され、sqlcmd で T-SQL ステートメントと sqlcmd コマンドを実行できるようになったことを示しています。 1> の隣で点滅しているアンダースコアは、入力したステートメントやコマンドが表示される位置を示す sqlcmd プロンプトです。 次に、「USE AdventureWorks2022」を入力して [Enter] キーを押してから、「GO」を入力して [Enter] キーを押します。 コマンド プロンプト ウィンドウの内容は次のようになります。

sqlcmd
USE AdventureWorks2022;
GO

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

Changed database context to 'AdventureWorks2022'.
1>

[Enter] キーを押すと、sqlcmd に新しい行が開始するように通知されます。 「GO」と入力してから [Enter] キーを押すことにより、USE AdventureWorks2022 ステートメントを sqlcmd のインスタンスに送信するよう 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> が表示されます。 sqlcmd セッションを終了するには、1> プロンプトで「EXIT」と入力します。 その状態で再度 EXIT コマンドを入力すると、コマンド プロンプト ウィンドウを閉じることができます。

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

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

重要

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

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

sqlcmd create mssql --help

次のコマンドは、最新バージョンの SQL Server 2022 (16.x) を使用して新しい SQL Server インスタンスを作成し、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

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

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

データベース スクリプト ファイルの作成方法はいくつかあります。

  • SQL Server Management Studio で T-SQL ステートメントのセットを対話的に作成およびデバッグして、クエリ処理時間帯の内容をスクリプト ファイルとして保存する。

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

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 を使って複数インスタンスに対してコードを実行する

ファイル内の次のコードは、2 つのインスタンスに接続するスクリプトです。 2 番目のインスタンスへの接続の前に 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. Windows スクリプト ファイルで sqlcmd を使う

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

最初に、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

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

sqlcmd は SQL Database データへの接続時に実行して、通信を暗号化するかどうか、および証明書を信頼するかどうかを指定できます。 次の 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

構文

次の構文の例は、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 が設定されていても暗号化が有効になります。