sqlcmd ユーティリティの使用
この sqlcmd
ユーティリティは、Transact-SQL ステートメントとスクリプトをアドホックで対話型で実行したり、Transact-SQL スクリプト タスクを自動化したりするためのコマンド ライン ユーティリティです。 対話形式で を使用するか、 を使用 sqlcmd
して sqlcmd
実行するスクリプト ファイルを作成するには、ユーザーが Transact-SQL を理解している必要があります。 sqlcmd
ユーティリティは一般的に次のように使用されます。
ユーザーは、コマンド プロンプトで作業するのと同様の方法で、Transact-SQL ステートメントを対話形式で入力します。 結果はコマンド プロンプトに表示されます。 コマンド プロンプト ウィンドウを開くには、 [スタート]ボタンをクリックし、 [すべてのプログラム]をポイントします。次に [アクセサリ]をポイントし、 [コマンド プロンプト]をクリックします。 コマンド プロンプトで「
sqlcmd
」と入力し、その後に必要なオプションのリストを入力します。 でsqlcmd
サポートされているオプションの完全な一覧については、「 sqlcmd ユーティリティ」を参照してください。ユーザーは、実行する
sqlcmd
1 つの Transact-SQL ステートメントを指定するか、実行する Transact-SQL ステートメントを含むテキスト ファイルにユーティリティをポイントすることによって、ジョブを送信します。 出力先はコマンド プロンプトにすることもできますが、通常はテキスト ファイルに出力されます。SQL Server Management Studio クエリ エディターの SQLCMD モード。
SQL Server 管理オブジェクト (SMO)
SQL Server エージェントの CmdExec ジョブ
一般的な sqlcmd オプション
最もよく使用されるオプションを次に示します。
接続先の Microsoft SQL Serverのインスタンスを識別する
sqlcmd
サーバー オプション (-S)。SQL Serverのインスタンスへの接続に使用する資格情報を指定する
sqlcmd
認証オプション (-E、-U、-P)。注意
-E オプションは既定値なので、指定する必要はありません。
への
sqlcmd
入力の場所を識別する入力オプション (-Q、-q、および -i)。出力を配置するファイルを指定する
sqlcmd
出力オプション (-o)。
sqlcmd ユーティリティへの接続
次に、sqlcmd
ユーティリティの一般的な使用法を示します。
Windows 認証を使用して既定のインスタンスに接続し、Transact-SQL ステートメントを対話的に実行します。
sqlcmd -S <ComputerName>
注意
前の例では、 -E は既定値
sqlcmd
であり、Windows 認証を使用して既定のインスタンスに接続するため、指定されていません。Windows 認証を使用して名前付きインスタンスに接続し、Transact-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 AdventureWorks2012.Person.Person"
Windows 認証を使用してローカル コンピューター上の既定のインスタンスに接続し、クエリを実行して、ファイルへの出力を指定し、クエリの完了後に
sqlcmd
を終了します。sqlcmd -Q "SELECT * FROM AdventureWorks2012.Person.Person" -o MyOutput.txt
SQL Server認証を使用して名前付きインスタンスに接続し、Transact-SQL ステートメントを対話形式で実行し
sqlcmd
、パスワードの入力を求めます。sqlcmd -U MyLogin -S <ComputerName>\<InstanceName>
注意
sqlcmd
ユーティリティでサポートされているオプションの一覧を表示するには、sqlcmd -?
を実行してください。
sqlcmd を使用した Transact-SQL ステートメントの対話的な実行
ユーティリティを sqlcmd
対話的に使用して、コマンド プロンプト ウィンドウで Transact-SQL ステートメントを実行できます。 を使用して Transact-SQL ステートメントをsqlcmd
対話形式で実行するには、-Q、-q、-Z、または -i オプションを使用せずにユーティリティを実行して、入力ファイルまたはクエリを指定します。 次に例を示します。
sqlcmd -S <ComputerName>\<InstanceName>
コマンドが入力ファイルまたはクエリなしで実行されると、sqlcmd
指定した SQL Server のインスタンスに接続し、プロンプトという名前の点滅するアンダースコアが続く新しい行1>
をsqlcmd
表示します。 は 1
、これが Transact-SQL ステートメントの最初の行であることを示し sqlcmd
、プロンプトは、入力時に Transact-SQL ステートメントが開始されるポイントです。
プロンプトでsqlcmd
、 や などの GO
EXIT
Transact-SQL ステートメントとsqlcmd
コマンドの両方を入力できます。 各 Transact-SQL ステートメントは、ステートメント キャッシュと呼ばれるバッファーに格納されます。 これらのステートメントは、コマンドを入力して Enter キーを押した後、SQL ServerにGO
送信されます。 を終了sqlcmd
するには、新しい行の先頭に または QUIT
と入力EXIT
します。
ステートメント キャッシュをクリアするには、「:RESET
」と入力します。 入力 ^C
すると終了します sqlcmd
。 ^C
は、GO
コマンドが実行された後に、ステートメント キャッシュの実行を停止するためにも使用できます。
対話型セッションに入力された Transact-SQL ステートメントは、 :ED コマンドと sqlcmd
プロンプトを入力することで編集できます。 起動したエディターで Transact-SQL ステートメントを編集して、エディターを終了すると、変更された Transact-SQL ステートメントがコマンド ウィンドウに表示されます。 を入力 GO
して、そこでVised Transact-SQL ステートメントを実行します。
引用符で囲まれた文字列
引用符で囲まれた文字列は、前処理がまったく行われずそのまま使用されます。ただし、例外として、2 つの連続する引用符を入力することで、引用符自体を文字列に挿入できます。 SQL Server は、この文字の並びを 1 つの引用符として扱います (ただし、この変換はサーバーで行われます)。スクリプト変数が文字列内に存在する場合は展開されません。
次に例を示します。
sqlcmd
PRINT "Length: 5"" 7'";
GO
結果セットは次のようになります。
Length: 5" 7'
複数行の文字列
sqlcmd
では、複数行の文字列になるスクリプトがサポートされています。 たとえば、次の SELECT
ステートメントは複数行にわたって記述されていますが、「 GO
」と入力して <localizedText>Enter</localizedText> キーを押すと、1 つの文字列として実行されます。
SELECT First line
FROM Second line
WHERE Third line;
GO
対話的な sqlcmd の例
sqlcmd
を対話的に実行する例を次に示します。
コマンド プロンプト ウィンドウを開くと、次のような行が表示されます。
C:\> _
これは、フォルダー C:\
が現在のフォルダーであり、ファイル名を指定すると Windows によってそのフォルダー内のファイルが検索されることを意味します。
「」と入力sqlcmd
して、ローカル コンピューター上の SQL Server の既定のインスタンスに接続します。コマンド プロンプト ウィンドウの内容は次のようになります。
C:\>sqlcmd
1> _
これは、SQL Server インスタンスへの接続が確立され、sqlcmd
で Transact-SQL ステートメントと sqlcmd
コマンドを実行できるようになったことを示しています。 1>
の隣で点滅しているアンダースコアは、入力したステートメントやコマンドが表示される位置を示す sqlcmd
プロンプトです。 次に、「」と入力 USE AdventureWorks2012
して Enter キーを押し、Enter キーを押 GO
します。 コマンド プロンプト ウィンドウの内容は次のようになります。
sqlcmd
USE AdventureWorks2012;
GO
結果セットは次のようになります。
Changed database context to 'AdventureWorks2012'.
1> _
「 USE AdventureWorks2012
」と入力した後で <localizedText>Enter</localizedText> キーを押すことにより、新しい行を開始するよう sqlcmd
に要求します。 「 GO,
」と入力してから Enter キーを押すことにより、 sqlcmd
ステートメントを USE AdventureWorks2012
のインスタンスに送信するよう SQL Serverに指示します。 sqlcmd
により、 USE
ステートメントが正常に完了したことを示すメッセージが返されます。その後、 1>
プロンプトが表示され、新しいステートメントやコマンドを入力できるようになります。
次の例では、 SELECT
ステートメント、 GO
を実行するための SELECT
、および EXIT
を終了するための sqlcmd
を入力した場合に、コマンド プロンプト ウィンドウに表示される内容を示します。
sqlcmd
USE AdventureWorks2012;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO
結果セットは次のようになります。
BusinessEntityID FirstName LastName
----------- -------------------------------- -----------
1 Syed Abbas
2 Catherine Abel
3 Kim Abercrombie
(3 rows affected)
1> EXIT
C:\>
行 3> GO
の後の行は、 SELECT
ステートメントの出力です。 出力の生成後、 sqlcmd
により sqlcmd
プロンプトがリセットされ、 1>
が表示されます。 行 EXIT
で「 1>
」と入力すると、最初にコマンド プロンプト ウィンドウを開いたときと同じ行が表示されます。 これは、 sqlcmd
のセッションを終了したことを示します。 その状態で再度 EXIT
コマンドを入力すると、コマンド プロンプト ウィンドウを閉じることができます。
sqlcmd を使用した Transact-SQL スクリプト ファイルの実行
sqlcmd
を使用してデータベース スクリプト ファイルを実行できます。 スクリプト ファイルは、Transact-SQL ステートメント、コマンド、 sqlcmd
スクリプト変数の組み合わせを含むテキスト ファイルです。 変数をスクリプト化する方法の詳細については、「 sqlcmd でのスクリプト変数の使用」をご覧ください。 スクリプト ファイル内のステートメント、コマンド、およびスクリプト変数に対して sqlcmd
で行われる処理は、対話的に入力したステートメントやコマンドの処理と似ています。 sqlcmd
が対話入力の場合と大きく異なる点は、ユーザーがステートメント、コマンド、およびスクリプト変数を入力するまで待機するのではなく、入力ファイルを最後まで中断することなく読み取るという点です。
データベース スクリプト ファイルの作成方法はいくつかあります。
SQL Server Management Studio で Transact-SQL ステートメントのセットを対話的に作成およびデバッグして、クエリ ウィンドウの内容をスクリプト ファイルとして保存する。
メモ帳などのテキスト エディターを使用して、Transact-SQL ステートメントを含んだテキスト ファイルを作成する。
例
A. sqlcmd を使用したスクリプトの実行
メモ帳を起動し、次の Transact-SQL ステートメントを入力します。
USE AdventureWorks2012;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO
MyFolder
というフォルダーを作成し、スクリプトを MyScript.sql
ファイルとして C:\MyFolder
フォルダーに保存します。 コマンド プロンプトで、次のコマンドを入力してスクリプトを実行し、結果を MyOutput.txt
の MyFolder
に出力します。
sqlcmd -i C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt
メモ帳で MyOutput.txt
を開くと、次のような内容が表示されます。
Changed database context to 'AdventureWorks2012'.
BusinessEntityID FirstName LastName
---------------- ----------- -----------
1 Syed Abbas
2 Catherine Abel
3 Kim Abercrombie
(3 rows affected)
B. sqlcmd と専用管理者接続の併用
次の例では、 sqlcmd
を使用して、ブロッキングの問題が発生しているサーバーに専用管理者接続 (DAC) で接続します。
C:\>sqlcmd -S ServerName -A
1> SELECT blocked FROM sys.dm_exec_requests WHERE blocked <> 0;
2> GO
結果セットは次のようになります。
spid blocked
------ -------
62 64
(1 rows affected)
sqlcmd
を使用してブロック中のプロセスを終了します。
1> KILL 64;
2> GO
C. sqlcmd を使用したストアド プロシージャの実行
次の例では、 sqlcmd
を使用してストアド プロシージャを実行します。 次のストアド プロシージャを作成します。
USE AdventureWorks2012;
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
sqlcmd
プロンプトで、次のコマンドを入力します。
C:\sqlcmd
1> :Setvar FirstName Gustavo
1> :Setvar LastName Achong
1> EXEC dbo.ContactEmailAddress $(Gustavo),$(Achong)
2> GO
EmailAddress
-----------------------------
gustavo0@adventure-works.com
D. sqlcmd を使用したデータベースのメンテナンス
次の例では、 sqlcmd
を使用してデータベースのメンテナンス タスクを実行します。 次のコードを使用して C:\BackupTemplate.sql
を作成します。
USE master;
BACKUP DATABASE [$(db)] TO DISK='$(bakfile)';
sqlcmd
プロンプトで、次のコマンドを入力します。
C:\ >sqlcmd
1> :connect <server>
Sqlcmd: Successfully connected to server <server>.
1> :setvar db msdb
1> :setvar bakfile c:\msdb.bak
1> :r c:\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:\>sqlcmd -d AdventureWorks2012
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:\InputFile.txt -o C:\OutputFile.txt,
コマンドはsqlcmd
、VBScript と共に.bat ファイルで実行できます。 この場合、対話型のオプションは使用しないでください。 また、.bat ファイルを実行するコンピューターには sqlcmd
がインストールされている必要があります。
最初に、次の 4 つのファイルを作成します。
C:\badscript.sql
SELECT batch_1_this_is_an_error GO SELECT 'batch #2' GO
C:\goodscript.sql
SELECT 'batch #1' GO SELECT 'batch #2' GO
C:\returnvalue.sql
:exit(select 100) @echo off C:\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:\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:\windowsscript.bat
を実行します。
C:\>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 -T
Windows 資格情報を使用して接続し、通信を暗号化して、サーバーの証明書を信頼する:
SQLCMD -E -N -C
プロバイダーで ForceProtocolEncryption = True
が指定されている場合、接続文字列で Encrypt=No
が設定されていても暗号化が有効になります。
参照
sqlcmd Utility
sqlcmd でのスクリプト変数の使用
クエリ エディターによる SQLCMD スクリプトの編集
ジョブ ステップの管理
CmdExec ジョブ ステップの作成