次の方法で共有


sqlcmd ユーティリティを使用する

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

  • ユーザーは、コマンド プロンプトで作業するのと同様の方法で、Transact-SQL ステートメントを対話形式で入力します。 結果はコマンド プロンプトに表示されます。 コマンド プロンプト ウィンドウを開くには、[ スタート] をクリックし、[ すべてのプログラム] をクリックし、[ アクセサリ] をポイントして、[ コマンド プロンプト] をクリックします。 コマンド プロンプトで「sqlcmd」と入力し、その後に必要なオプションのリストを入力します。 sqlcmdでサポートされているオプションの完全な一覧については、「sqlcmd ユーティリティ」を参照してください。

  • ユーザーは、実行する単一 sqlcmd の Transact-SQL ステートメントを指定するか、実行するステートメントを含むテキスト ファイルにユーティリティを指定して、Transact-SQL ジョブを送信します。 通常、出力はテキスト ファイルに送られますが、コマンド プロンプトに表示することもできます。

  • SQL Server Management Studio クエリ エディターの SQLCMD モード

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

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

通常使用される sqlcmd オプション

最も頻繁に使用されるオプションは次のとおりです。

  • sqlcmdが接続する Microsoft SQL Server のインスタンスを識別するサーバー オプション (-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>  
    

    又は

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

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

対話型セッションに入力された Transact-SQL ステートメントは、 :ED コマンドと sqlcmd プロンプトを入力して編集できます。 エディターが開き、Transact-SQL ステートメントを編集してエディターを閉じると、変更した Transact-SQL ステートメントがコマンド ウィンドウに表示されます。 GOを入力して、修正版の Transact-SQL ステートメントを実行します。

引用符で囲まれた文字列

引用符で囲まれた文字列は、前処理がまったく行われずそのまま使用されます。ただし、例外として、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 実行したときに表示される内容の例です。

コマンド プロンプト ウィンドウを開くと、次のような 1 行があります。

C:\> _

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

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

C:\>sqlcmd

1> _

つまり、SQL Server のインスタンスに接続し、 sqlcmd Transact-SQL ステートメントと sqlcmd コマンドを受け入れる準備ができました。 1>の後の点滅するアンダースコアは、入力したステートメントとコマンドが表示される場所を示すsqlcmd プロンプトです。 次に、「 USE AdventureWorks2012 」と入力して Enter キーを押し、「 GO 」と入力して Enter キーを押します。 コマンド プロンプト ウィンドウの内容は次のようになります。

sqlcmd

USE AdventureWorks2012;

GO

結果セットを次に示します。

Changed database context to 'AdventureWorks2012'.

1> _

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

次の例は、SELECT ステートメント、SELECTを実行するGOsqlcmdを終了するEXITを入力した場合のコマンド プロンプト ウィンドウの内容を示しています。

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 ステートメントの出力です。 出力を生成した後、sqlcmdsqlcmd プロンプトをリセットし、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 AdventureWorks2012;

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

メモ帳で 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 ファイルで実行できます。 この場合は、対話型オプションを使用しないでください。 sqlcmd は、.bat ファイルを実行しているコンピューターにインストールする必要があります。

まず、次の 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 での暗号化の設定

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 (連結時に NULL を使用することを許可する設定)

  • SET ANSI_PADDING

  • SET QUERY_GOVERNOR_COST_LIMIT

構文

次の例は、SQL Server ネイティブ クライアント プロバイダーの設定に次のようなケースを示します。 ForceProtocolEncryption = FalseTrust Server Certificate = No

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

SQLCMD -E -N  
  

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

SQLCMD -E -C  
  

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

SQLCMD -E -N -C  
  

次の例は、SQL Server Native Client Provider の設定に次のようなケースを示しています: ForceProtocolEncryption = TrueTrustServerCertificate = Yes

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

SQLCMD -E  
  

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

SQLCMD -E -N  
  

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

SQLCMD -E -T  
  

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

SQLCMD -E -N -C  
  

プロバイダーが ForceProtocolEncryption = True を指定した場合、接続文字列に Encrypt=No 場合でも暗号化が有効になります。

こちらもご覧ください

sqlcmd ユーティリティ
sqlcmd でのスクリプト変数の使用
クエリ エディターによる SQLCMD スクリプトの編集
ジョブ ステップの管理
CmdExec ジョブ ステップの作成