sqlcmd ユーティリティの使用
sqlcmd ユーティリティは、Transact-SQL ステートメントおよびスクリプトを対話形式でアドホック実行したり、Transact-SQL スクリプト タスクを自動化したりするための Microsoft Win32 コマンド プロンプト ユーティリティです。sqlcmd を対話形式で使用したり、sqlcmd を使用して実行できるスクリプト ファイルを作成したりするには、ユーザーが Transact-SQL を理解している必要があります。sqlcmd ユーティリティは一般的に次のように使用されます。
コマンド プロンプトでの操作と同様、Transact-SQL ステートメントを対話形式で入力します。結果はコマンド プロンプトに表示されます。コマンド プロンプト ウィンドウを開くには、[スタート] ボタンをクリックし、[すべてのプログラム] をポイントします。次に [アクセサリ] をポイントし、[コマンド プロンプト] をクリックします。コマンド プロンプトで「sqlcmd」と入力し、その後に必要なオプションのリストを入力します。sqlcmd でサポートされるオプションの一覧については、「sqlcmd ユーティリティ」を参照してください。
実行する Transact-SQL ステートメントを 1 つ指定するか、実行する Transact-SQL ステートメントの入ったテキスト ファイルをユーティリティに指定して、sqlcmd ジョブを実行します。出力先はコマンド プロンプトにすることもできますが、通常はテキスト ファイルに出力されます。
SQL Server Management Studio クエリ エディターの SQLCMD モード。
SQL Server 管理オブジェクト (SMO)。
SQL Server エージェントの CmdExec ジョブ。
一般的な sqlcmd オプション
最もよく使用されるオプションを次に示します。
サーバー オプション (-S)。sqlcmd から接続する Microsoft SQL Server インスタンスを指定します。
認証オプション (-E、-U、および -P)。sqlcmd から SQL Server インスタンスに接続するために使用する資格情報を指定します。
注 -E オプションは既定値なので、指定しなくてもかまいません。
入力オプション (-Q、-q、および -i)。sqlcmd への入力場所を指定します。
出力オプション (-o)。sqlcmd の結果を出力するファイルを指定します。
sqlcmd ユーティリティへの接続
次に、sqlcmd ユーティリティの一般的な使用法を示します。
Windows 認証を使用して既定のインスタンスに接続し、Transact-SQL ステートメントを対話的に実行します。
sqlcmd -S <ComputerName>
注 上記の例で -E が指定されていないのは、このスイッチが既定値であるためです。ここでは sqlcmd から Windows 認証を使用して既定のインスタンスに接続しています。
Windows 認証を使用して名前付きインスタンスに接続し、Transact-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 AdventureWorks2008R2.Person.Person"
Windows 認証を使用してローカル コンピューター上の既定のインスタンスに接続し、クエリを実行して、ファイルへの出力を指定し、クエリの完了後に sqlcmd を終了します。
sqlcmd -Q "SELECT * FROM AdventureWorks2008R2.Person.Person" -o MyOutput.txt
SQL Server 認証を使用して名前付きインスタンスに接続し、sqlcmd からパスワードの入力を求めて Transact-SQL ステートメントを対話的に実行します。
sqlcmd -U MyLogin -S <ComputerName>\<InstanceName>
注 sqlcmd ユーティリティでサポートされているオプションの一覧を表示するには、sqlcmd -? を実行してください。
sqlcmd を使用した Transact-SQL ステートメントの対話的な実行
コマンド プロンプト ウィンドウでは、sqlcmd ユーティリティを対話的に使用して、Transact-SQL ステートメントを実行できます。sqlcmd を使用して対話的に Transact-SQL ステートメントを実行するには、入力ファイルまたはクエリを指定するための -Q、-q、-Z、または -i オプションを使用せずにこのユーティリティを実行します。次に例を示します。
sqlcmd -S <ComputerName>\<InstanceName>
入力ファイルやクエリを指定せずにこのコマンドを実行すると、sqlcmd は指定された SQL Server のインスタンスに接続した後、新しい行に 1> と表示し、その隣でアンダースコアを点滅させます。これを sqlcmd プロンプトと呼びます。1 は、Transact-SQL ステートメントの最初の行であることを示します。この sqlcmd プロンプトが Transact-SQL ステートメントの入力開始位置になります。
sqlcmd プロンプトでは、Transact-SQL ステートメントと、GO や EXIT などの sqlcmd コマンドの両方を入力できます。各 Transact-SQL ステートメントは、ステートメント キャッシュと呼ばれるバッファーに格納されます。GO コマンドを入力し、Enter キーを押すと、これらのステートメントが SQL Server に送信されます。sqlcmd を終了するには、新しい行の先頭で「EXIT」または「QUIT」と入力します。
ステートメント キャッシュをクリアするには、「:RESET」と入力します。「^C」と入力すると、sqlcmd が終了します。^C は、GO コマンドが実行された後に、ステートメント キャッシュの実行を停止するためにも使用できます。
対話型セッションで入力された Transact-SQL ステートメントは、sqlcmd プロンプトで :ED コマンドを入力することによって編集できます。起動したエディターで Transact-SQL ステートメントを編集して、エディターを終了すると、変更された Transact-SQL ステートメントがコマンド ウィンドウに表示されます。変更された Transact-SQL ステートメントを実行するには、「GO」と入力します。
引用符で囲まれた文字列
引用符で囲まれた文字列は、前処理がまったく行われずそのまま使用されます。ただし、例外として、2 つの連続する引用符を入力することで、引用符自体を文字列に挿入できます。SQL Server では、2 つの連続する引用符を 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:\> _
これは、フォルダー C:\ が現在のフォルダーであり、ファイル名を指定すると Windows によってそのフォルダー内のファイルが検索されることを意味します。
「sqlcmd」と入力して、ローカル コンピューターの SQL Server の既定のインスタンスに接続します。コマンド プロンプト ウィンドウの内容は次のようになります。
C:\>sqlcmd
1> _
これは、SQL Server インスタンスへの接続が確立され、sqlcmd で Transact-SQL ステートメントと sqlcmd コマンドを実行できるようになったことを示しています。1> の隣で点滅しているアンダースコアは、入力したステートメントやコマンドが表示される位置を示す sqlcmd プロンプトです。ここで、「USE AdventureWorks2008R2」と入力して Enter キーを押した後、「GO」と入力してもう一度 Enter キーを押します。コマンド プロンプト ウィンドウの内容は次のようになります。
sqlcmd
USE AdventureWorks2008R2;
GO
以下に結果セットを示します。
Changed database context to 'AdventureWorks2008R2'.
1> _
「USE AdventureWorks2008R2」と入力した後で Enter キーを押すことにより、新しい行を開始するよう sqlcmd に要求します。「GO」と入力してから Enter キーを押すことにより、USE AdventureWorks2008R2 ステートメントを SQL Server のインスタンスへ送信するよう sqlcmd に指示します。次に、sqlcmd により、USE ステートメントが正常に完了したことを示すメッセージが返されます。その後、1> プロンプトが表示され、新しいステートメントやコマンドを入力できるようになります。
次の例では、SELECT ステートメント、SELECT を実行するための GO、および sqlcmd を終了するための EXIT を入力した場合に、コマンド プロンプト ウィンドウに表示される内容を示します。
sqlcmd
USE AdventureWorks2008R2;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO
以下に結果セットを示します。
BusinessEntityID FirstName LastName
----------- -------------------------------- -----------
1 Syed Abbas
2 Catherine Abel
3 Kim Abercrombie
(3 行処理されました)
1> EXIT
C:\>
行 3> GO の後の行は、SELECT ステートメントの出力です。出力の生成後、sqlcmd により sqlcmd プロンプトがリセットされ、1> が表示されます。行 1> で「EXIT」と入力すると、最初にコマンド プロンプト ウィンドウを開いたときと同じ行が表示されます。これは、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 AdventureWorks2008R2;
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
メモ帳で MyOutput.txt を開くと、次のような内容が表示されます。
Changed database context to 'AdventureWorks2008R2'.
BusinessEntityID FirstName LastName
---------------- ----------- -----------
1 Syed Abbas
2 Catherine Abel
3 Kim Abercrombie
(3 行処理されました)
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 行処理されました)
sqlcmd を使用してブロック中のプロセスを終了します。
1> KILL 64;
2> GO
C. sqlcmd を使用したストアド プロシージャの実行
次の例では、sqlcmd を使用してストアド プロシージャを実行します。次のストアド プロシージャを作成します。
USE AdventureWorks2008R2;
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 AdventureWorks2008R2
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 コマンドは、.bat ファイルで VBScript と共に実行できます。この場合、対話型のオプションは使用しないでください。また、.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 を実行します。
C:\>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 データベースでの暗号化の設定
SQL Azure データへの接続時に sqlcmdを実行して、通信を暗号化するかどうか、および証明書を信頼するかどうかを指定できます。次の 2 つの sqlcmdオプションを使用できます。
暗号化された接続を要求するには、クライアント側で -N スイッチを使用します。このオプションは、ADO.net の ENCRYPT = true オプションと同等です。
サーバーの証明書を信頼し、その有効性を検証しないように設定するには、クライアント側で -C スイッチを使用します。このオプションは、ADO.net の TRUSTSERVERCERTIFICATE = true オプションと同等です。
SQL Azure サービスは、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 が設定されていても暗号化が有効になります。