次の方法で共有


sqlcmd ユーティリティ

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

sqlcmd ユーティリティを使用すると、Transact-SQL ステートメントやシステム プロシージャ、スクリプト ファイルを使用可能なさまざまなモードで入力できます。

  • コマンド プロンプト。
  • クエリ エディターでの SQLCMD モード。
  • Windows スクリプト ファイル。
  • SQL Server エージェント ジョブのオペレーティング システム (cmd.exe) ジョブ ステップ。

注意

Microsoft Entra ID はAzure Active Directory (Azure AD) の新しい名前ですが、既存の環境の中断を防ぐために、UI フィールド、接続プロバイダー、エラー コード、コマンドレットなど、ハードコーディングされた一部の要素でAzure AD が残ります。 この記事では、2 つの名前は交換可能です。

インストールしたバージョンを確認する

sqlcmd には次の 2 種類のバージョンがあります。

  • go-mssqldb ベースの sqlcmdgo-sqlcmd スタイルになることもあります。 このバージョンは、SQL Server とは別にダウンロードできるスタンドアロン ツールです。

  • ODBC ベースの sqlcmd。SQL Server または Microsoft Command Line Utilities で使用でき、Linux 上の mssql-tools パッケージの一部です。

インストールしたバージョンを確認するには、コマンド ラインで次のステートメントを実行します。

sqlcmd "-?"
sqlcmd "-?"
sqlcmd -?

新しいバージョンの sqlcmd (Go) を使用している場合、出力は次の例のようになります。

Version: 1.3.1

バージョンの確認

sqlcmd --version を使用して、インストールされているバージョンを確認できます。 バージョン 1.0.0 以上がインストールされている必要があります。

重要

パッケージ マネージャーを使用して sqlcmd (Go) をインストールすると、環境パスで sqlcmd (ODBC) が sqlcmd (Go) に置き換えられます。 この機能を有効にするには、現在のコマンド ライン セッションを閉じてから再度開く必要があります。 sqlcmd (ODBC) は削除されず、実行可能ファイルへの完全なパスを指定すると引き続き使用できます。 PATH 変数を更新して、優先される変数を指定することもできます。 Windows 11 でこれを行うには、[システム設定] を開き、[バージョン情報] > [システムの詳細設定] の順に移動します。 [システムのプロパティ] が開いたら、[環境変数] ボタンを選択します。 下半分の [システム変数] で、[Path][編集] の順に選択します。 sqlcmd (Go) が保存されている場所 (C:\Program Files\sqlcmd が既定値) がリスト内で C:\Program Files\Microsoft SQL Server\<version>\Tools\Binn より前にある場合、sqlcmd (Go) が使用されます。 この順序を逆にして、sqlcmd (ODBC) をもう一度既定値にできます。

sqlcmd のダウンロードとインストール

sqlcmd (Go) は、Microsoft Windows、macOS、Linux にクロスプラットフォームでインストールできます。 1.6 以降の新しいバージョンは、すべてのパッケージ マネージャーで利用できない場合があります。 利用可能予定日は未定です。

winget (Windows パッケージ マネージャー CLI)

  1. まだインストールしていない場合は、Windows パッケージ マネージャー クライアントをインストールします。

  2. 次のコマンドを実行して sqlcmd (Go) をインストールします。

    winget install sqlcmd
    

Chocolatey

  1. Chocolatey をまだインストールしていない場合はインストールします。

  2. 次のコマンドを実行して sqlcmd (Go) をインストールします。

    choco install sqlcmd
    

直接ダウンロード

  1. GitHub コード リポジトリで、sqlcmd (Go) の最新リリースから対応する -windows-amd64.zip または -windows-arm.zip アセットをダウンロードします。

  2. ダウンロードした zip フォルダーから sqlcmd.exe ファイルを抽出します。

プレインストール済み

Azure Cloud Shell

sqlcmd ユーティリティは既定でプレインストールされているため、次の Azure Cloud Shell から試用できます。

Azure Data Studio

Azure Data Studio で SQLCMD ステートメントを実行するには、エディターのツール バーで [SQLCMD を有効にする] を選択します。

SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) で SQLCMD ステートメントを実行するには、上部のナビゲーションの [クエリ メニュー] ドロップダウン リストから SQLCMD モードを選択します。

SSMS では、クエリ エディターの標準モードと SQLCMD モードでの実行に Microsoft .NET フレームワーク SqlClient を使用します。 コマンド ラインから sqlcmd を実行する場合、sqlcmd では ODBC ドライバーが使用されます。 同じクエリでも、SQLCMD モードの SSMS で実行する場合と sqlcmd ユーティリティで実行する場合では、適用される既定のオプションが異なるので、動作も異なる可能性があります。

構文

Usage:
  sqlcmd [flags]
  sqlcmd [command]

Examples:
# Install/Create, Query, Uninstall SQL Server
  sqlcmd create mssql --accept-eula --using https://aka.ms/AdventureWorksLT.bak
  sqlcmd open ads
  sqlcmd query "SELECT @@version"
  sqlcmd delete
# View configuration information and connection strings
  sqlcmd config view
  sqlcmd config cs

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  config      Modify sqlconfig files using subcommands like "sqlcmd config use-context mssql"
  create      Install/Create SQL Server, Azure SQL, and Tools
  delete      Uninstall/Delete the current context
  help        Help about any command
  open        Open tools (e.g ADS) for current context
  query       Run a query against the current context
  start       Start current context
  stop        Stop current context

Flags:
  -?, --?                  help for backwards compatibility flags (-S, -U, -E etc.)
  -h, --help               help for sqlcmd
      --sqlconfig string   configuration file (default "/Users/<currentUser>/.sqlcmd/sqlconfig")
      --verbosity int      log level, error=0, warn=1, info=2, debug=3, trace=4 (default 2)
      --version            print version of sqlcmd

Use "sqlcmd [command] --help" for more information about a command.

sqlcmd 構文と使用の詳細については、「ODBC sqlcmd 構文」を参照してください。

sqlcmd (ODBC) からの破壊的変更

sqlcmd (Go) では、いくつかのスイッチと動作が変更されました。 欠落している下位互換性フラグの最新の一覧については、GitHub の「後方互換性フラグの実装の優先順位付け」を参照してください。

  • 以前のバージョンの sqlcmd (Go) では、-P スイッチは一時的に削除され、SQL Server 認証のパスワードは次のメカニズムでのみ指定できました。

    • SQLCMDPASSWORD 環境変数
    • :CONNECT コマンド
    • メッセージが表示されたら、ユーザーはパスワードを入力して接続を完了できます
  • -r には 0 または 1 引数が必要です

  • -R スイッチが削除されました。

  • -I スイッチが削除されました。 引用符で囲まれた識別子の動作を無効にするには、スクリプトに SET QUOTED IDENTIFIER OFF を追加します。

  • 暗号化の選択を指定するために、-Ntruefalse、または disable のいずれかの文字列値を指定できるようになりました。 (default は、パラメーターを省略するのと同じです)

    • -N-C が指定されていない場合、sqlcmd では、サーバー証明書が検証されずにサーバーと認証がネゴシエートされます。
    • -N が指定されていて、-C が指定されていない場合、sqlcmd では、サーバー証明書の検証が必須となります。 暗号化の false 値でも、ログイン パケットの暗号化を実行できます。
    • -N-C の両方が指定されている場合、sqlcmd は、暗号化のネゴシエーションのためにそれらの値を使用します。
    • クライアント/サーバーの暗号化ネゴシエーションについて詳しくは、「MS-TDS PRELOGIN」を参照してください。
  • -u: 生成される Unicode 出力ファイルに UTF-16 リトル エンディアン バイト オーダー マーク (BOM) が書き込まれています。

  • 一部のデータ型の列ヘッダーの配置など、OSQL との互換性を維持するために保持されていた一部の動作が変更されました。

  • すべてのコマンドを 1 行に収める必要があります。これは EXIT でも同じです。 対話モードでは、コマンドの左かっこや引用符はチェックされず、連続する行の入力は求められません。 この動作は ODBC バージョンとは異なり、EXIT(query) でクエリを実行して、複数行にまたがることができます。

sqlcmd (Go) ユーティリティからの接続は TCP 接続に制限されます。 現在のところ、名前付きパイプは go-mssqldb ドライバーではサポートされていません。

機能強化

  • :Connect に、オプションの -G パラメーターが追加されました。このパラメーターを使用して、SqlAuthenticationActiveDirectoryDefaultActiveDirectoryIntegratedActiveDirectoryServicePrincipalActiveDirectoryManagedIdentityActiveDirectoryPassword のいずれかの認証方法を Azure SQL Database 用に選択できます。 詳細については、Microsoft Entra 認証に関するページを参照してください。 -G が指定されていない場合、-U ユーザー名パラメーターの有無に応じて、統合セキュリティまたは SQL Server 認証が使用されます。

  • 新しい --driver-logging-level コマンド ライン パラメーターを使用すると、go-mssqldb ドライバーからのトレースを確認できます。 すべてのトレースを確認するには、64 を使用します。

  • sqlcmd で、縦方向形式を使用して結果を出力できるようになりました。 これを設定するには、新しい -F vertical コマンド ライン スイッチを使用します。 SQLCMDFORMAT スクリプト変数を使って制御することもできます。

コマンド ライン オプション

-A

専用管理者接続 (DAC) を使用して SQL Server にサインインします。 この種類の接続は、サーバーのトラブルシューティングで使用されます。 この接続は、DAC をサポートしているサーバー コンピューターでのみ機能します。 DAC を使用できない場合は、sqlcmd はエラー メッセージを生成して終了します。 DAC の詳細については、「 データベース管理者用の診断接続」を参照してください。 -A オプションは -G オプションではサポートされていません。 -A を使用して Azure SQL Database に接続する場合は、論理 SQL サーバーの管理者である必要があります。 Microsoft Entra 管理者は DAC を使用できません。

C:

クライアントでこのオプションを使用して、サーバー証明書を検証せずに暗黙的に信頼するようにクライアントを構成できます。 このオプションは、ADO.NET オプションの TRUSTSERVERCERTIFICATE = trueと同等です。

sqlcmd (Go) ユーティリティの場合、次の条件も適用されます。

  • -N-C が指定されていない場合、sqlcmd では、サーバー証明書が検証されずにサーバーと認証がネゴシエートされます。
  • -N が指定されていて、-C が指定されていない場合、sqlcmd では、サーバー証明書の検証が必須となります。 暗号化の false 値でも、ログイン パケットの暗号化を実行できます。
  • -N-C の両方が指定されている場合、sqlcmd は、暗号化のネゴシエーションのためにそれらの値を使用します。

-d db_name

sqlcmd の開始時に USE <db_name> ステートメントを実行します。 このオプションにより、sqlcmd スクリプト変数 SQLCMDDBNAME が設定されます。 このパラメーターにより初期データベースが指定されます。 既定値は、ログインの既定データベースのプロパティです。 データベースが存在しない場合は、エラー メッセージが生成され、sqlcmd は終了します。

-D

-S に指定されたサーバー名を、ホスト名としてではなく、DSN として解釈します。 詳細については、「sqlcmd による接続」の「sqlcmd と bcp での DSN のサポート」を参照してください。

注意

-D オプションは、Linux および macOS のクライアントでのみ使用できます。 これは、Windows クライアントでは以前、廃止済みオプションとされていましたが、これまでに削除され、現在は無視されています。

-l login_timeout

サーバーに接続を試みたときに、 sqlcmd が ODBC ドライバーにログインするまでのタイムアウトを秒数で指定します。 このオプションにより、sqlcmd スクリプト変数 SQLCMDLOGINTIMEOUT が設定されます。 sqlcmd でのログインに関する既定のタイムアウトは 8 秒です。 -G オプションを使用して、Azure SQL Database または Azure Synapse Analytics に接続し、Microsoft Entra ID で認証する場合は、タイムアウト値を 30 秒以上にすることをお勧めします。 ログイン タイムアウトは、0 から 65534 の数値にする必要があります。 指定した値が数値以外の場合、またはその範囲外の場合、sqlcmd によりエラー メッセージが生成されます。 この値に 0 を指定すると、タイムアウトは無制限になります。

-E

ユーザー名とパスワードを使用せずにセキュリティ接続を使用して SQL Server にサインインします。 既定では、 -E を指定しないと、 sqlcmd ではセキュリティ接続オプションが使用されます。

-E オプションを使用すると、SQLCMDPASSWORD などのユーザー名とパスワード用に使用できる環境変数の設定が無視されます。 -E オプションが -U オプションまたは -P オプションと共に使用されると、エラー メッセージが生成されます。

-g

列の暗号化設定を Enabled に設定します。 詳細については、「 Always Encrypted」を参照してください。 Windows 証明書ストアに格納されているマスター キーのみがサポートされます。 -g オプションには、sqlcmd バージョン 13.1 以降が必要です。 バージョンを判断するには、 sqlcmd -?を実行します。

-G

このオプションは、Azure SQL Database または Azure Synapse Analytics に接続し、Microsoft Entra 認証を使用してユーザーを認証するように指定する場合に、クライアントによって使用されます。 このオプションにより、sqlcmd スクリプト変数 SQLCMDUSEAAD = true が設定されます。 -G オプションには、sqlcmd バージョン 13.1 以降が必要です。 バージョンを判断するには、 sqlcmd -?を実行します。 詳細については、Microsoft Entra 認証を使用した SQL Database または Azure Synapse Analytics への接続に関する記事を参照してください。 -A オプションは -G オプションではサポートされていません。

-G オプションは、Azure SQL Database と Azure Synapse Analytics にのみ適用されます。

現在、Microsoft Entra 対話型認証は、Linux または macOS ではサポートされていません。 Microsoft Entra 統合認証には、Microsoft ODBC Driver 17 for SQL Server バージョン 17.6.1 以降と、適切に構成された Kerberos 環境が必要です。

Microsoft Entra 認証に関する詳細は、sqlcmd での Microsoft Entra 認証に関するページを参照してください。

-H workstation_name

ワークステーション名です。 このオプションにより、sqlcmd スクリプト変数 SQLCMDWORKSTATION が設定されます。 ワークステーション名は sys.sysprocesses カタログ ビューの hostname 列に一覧表示され、ストアド プロシージャ sp_whoを使用して取得できます。 このオプションが指定されていない場合の既定値は、現在のコンピューター名になります。 この名前は、異なる sqlcmd セッションを識別する場合に使用できます。

-j

画面に生のエラー メッセージを出力します。

-K application_intent

アプリケーションがサーバーに接続するときのワークロードのタイプを宣言します。 現在サポートされている値は、ReadOnly です。 -K を指定しない場合、sqlcmd では可用性グループのセカンダリ レプリカへの接続がサポートされません。 詳細については、アクティブなセカンダリ: 読み取り可能なセカンダリ レプリカ (AlwaysOn 可用性グループ) に関する記事を参照してください。

-M multisubnet_failover

SQL Server 可用性グループまたは SQL Server フェールオーバー クラスター インスタンスの可用性グループ リスナーに接続する際には、必ず -M を指定してください。 -M を指定すると、(現在) アクティブなサーバーを迅速に検出して接続できます。 -M を指定しない場合、 -M はオフになります。 詳細については、「リスナー、クライアント接続、アプリケーションのフェールオーバー」、「可用性グループの作成と構成 (SQL Server)」、「フェールオーバー クラスタリングと Always On 可用性グループ (SQL Server)」、「アクティブなセカンダリ: 読み取り可能なセカンダリ レプリカ (Always On 可用性グループ)」をご覧ください。

-N

クライアントでこのオプションを使用して、暗号化された接続を要求できます。

sqlcmd (Go) ユーティリティの場合、暗号化の選択を指定するために、-Ntruefalse、または disable のいずれかの文字列値を指定できるようになりました。 (default は、次のようにパラメーターを省略するのと同じです)。

  • -N-C が指定されていない場合、sqlcmd では、サーバー証明書が検証されずにサーバーと認証がネゴシエートされます。
  • -N が指定されていて、-C が指定されていない場合、sqlcmd では、サーバー証明書の検証が必須となります。 暗号化の false 値でも、ログイン パケットの暗号化を実行できます。
  • -N-C の両方が指定されている場合、sqlcmd は、暗号化のネゴシエーションのためにそれらの値を使用します。

-P password

ユーザーが指定したパスワード。 パスワードでは大文字と小文字が区別されます。 -U オプションを使って -P オプションを使わず、SQLCMDPASSWORD 環境変数が設定されていない場合、sqlcmd はユーザーにパスワードを要求します。 null (空白) パスワードは使わないことをお勧めしますが、パラメーター値に連続する二重引用符のペア ("") を使って、null パスワードを指定できます。

重要

-P の使用は安全でないと見なされます。 コマンド ラインでパスワードを指定しないようにしてください。 または、SQLCMDPASSWORD 環境変数を使用するか、-P オプションを省略してパスワードを対話的に入力します。

強力なパスワードを使用することをお勧めします。

パスワード プロンプトは、次のようにパスワード プロンプトをコンソールに出力することによって表示されます。 Password:

ユーザーが行った入力は表示されません。 つまり、入力時には何も表示されず、カーソルが移動しません。

SQLCMDPASSWORD 環境変数を使用して、現在のセッションに既定のパスワードを設定できます。 したがって、パスワードをバッチ ファイルにハード コードする必要はありません。 次の例では、まずコマンド プロンプトで SQLCMDPASSWORD 変数を設定してから sqlcmd ユーティリティにアクセスします。

コマンド プロンプトに、次のコマンドを入力します。

SET SQLCMDPASSWORD=p@a$$w0rd
sqlcmd
SET SQLCMDPASSWORD=p@a$$w0rd
sqlcmd
SET SQLCMDPASSWORD=p@a$$w0rd
sqlcmd

ユーザー名とパスワードの組み合わせが正しくない場合は、エラー メッセージが生成されます。

注意

OSQLPASSWORD 環境変数は下位互換性を維持しています。 SQLCMDPASSWORD 環境変数は OSQLPASSWORD 環境変数よりも優先されます。 これにより、 sqlcmdosql を競合することなく組み合わせて使用できます。 以前のスクリプトは引き続き機能します。

-P オプションが -E オプションと同時に使用されると、エラー メッセージが生成されます。

-P オプションの後に複数の引数があると、エラー メッセージが生成され、プログラムが終了します。

特殊文字を含むパスワードでは、エラー メッセージが生成される可能性があります。 -P を使用する場合は特殊文字をエスケープするか、代わりに SQLCMDPASSWORD 環境変数を使用する必要があります。

-S [protocol:]server[\instance_name][,port]

接続先となる SQL Server のインスタンスを指定します。 sqlcmd スクリプト変数 SQLCMDSERVER が設定されます。

そのサーバー コンピューター上の SQL Server の既定のインスタンスに接続するには、server_name を指定します。 そのサーバー コンピューター上の SQL Server の名前付きインスタンスに接続するには、server_name[\instance_name] を指定します。 サーバー コンピューターを指定しない場合、sqlcmd は、ローカル コンピューター上にある SQL Server の既定のインスタンスに接続します。 ネットワーク上のリモート コンピューターから sqlcmd を実行するときは、このオプションが必要です。

protocol には、 tcp (TCP/IP)、 lpc (共有メモリ)、または np (名前付きパイプ) を指定できます。

sqlcmd を実行するときに server_name[\instance_name] を指定しなかった場合は、SQL Server により SQLCMDSERVER 環境変数がチェックされ、その値が使われます。

注意

OSQLSERVER 環境変数は下位互換性を維持しています。 SQLCMDSERVER 環境変数は OSQLSERVER 環境変数よりも優先されます。 これにより、 sqlcmdosql を競合することなく組み合わせて使用できます。 以前のスクリプトは引き続き機能します。

-U login_id

ログイン名または包含データベースのユーザー名です。 包含データベースのユーザーの場合、データベース名のオプション (-d) を指定する必要があります。

注意

OSQLUSER 環境変数は下位互換性を維持しています。 SQLCMDUSER 環境変数は OSQLUSER 環境変数よりも優先されます。 これにより、 sqlcmdosql を競合することなく組み合わせて使用できます。 以前のスクリプトは引き続き機能します。

-U オプションも -P オプションも指定しないと、sqlcmd は Windows 認証モードを使用して接続を試みます。 認証は sqlcmdを実行しているユーザーの Windows アカウントに基づきます。

-U オプションが -E オプション (この記事の後半で説明) と同時に使用されると、エラー メッセージが生成されます。 -U オプションの後に複数の引数があると、エラー メッセージが生成され、プログラムが終了します。

-z new_password

パスワードを変更します。

sqlcmd -U someuser -P s0mep@ssword -z a_new_p@a$$w0rd
sqlcmd -U someuser -P s0mep@ssword -z a_new_p@a$$w0rd
sqlcmd -U someuser -P s0mep@ssword -z a_new_p@a$$w0rd

-Z new_password

パスワードを変更して終了します。

sqlcmd -U someuser -P s0mep@ssword -Z a_new_p@a$$w0rd
sqlcmd -U someuser -P s0mep@ssword -Z a_new_p@a$$w0rd
sqlcmd -U someuser -P s0mep@ssword -Z a_new_p@a$$w0rd

入力または出力のオプション

-f codepage | i:codepage[,o:codepage] | o:codepage[,i:codepage]

入力と出力のコード ページを指定します。 コード ページ番号は、インストールされた Windows コード ページを指定する数値です。

コード ページには次の変換規則があります。

  • コード ページを指定しないと、入力ファイルが変換不要の Unicode ファイルでない限り、 sqlcmd では、入力ファイルと出力ファイルの両方に現在のコード ページが使用されます。

  • sqlcmd では、ビッグ エンディアンとリトル エンディアンの両方の Unicode 入力ファイルが自動的に認識されます。 -u オプションを指定すると、出力は常にリトル エンディアン Unicode になります。

  • 出力ファイルを指定しないと、出力コード ページがコンソールのコード ページになります。 この方法では、コンソールに出力が正しく表示されます。

  • 複数の入力ファイルの場合、同じコード ページが指定されているものと見なされます。 Unicode 入力ファイルと Unicode 以外の入力ファイルを混在させることができます。

cmd.exe のコード ページを確認するには、コマンド プロンプトに「chcp」と入力します。

-i input_file[,input_file2...]

Transact-SQL ステートメントまたはストアド プロシージャのバッチを含むファイルを指定します。 複数のファイルを指定すると、それらは順番に読み取られて処理されます。 ファイル名とファイル名の間には空白を使わないでください。 sqlcmd により、最初に、指定したすべてのファイルが存在しているかどうかがチェックされます。 1 つ以上のファイルが存在していない場合、sqlcmd は終了します。 -i-Q/-q オプションは同時に指定できません。

パスの例:

-i C:\<filename>
-i \\<Server>\<Share$>\<filename>
-i "C:\Some Folder\<file name>"

空白を含むファイル パスは、引用符で囲む必要があります。

このオプションは のように複数使用できます。

sqlcmd -i <input_file1> -i <input_file2>
sqlcmd -i <input_file1> -i <input_file2>
sqlcmd -i <input_file1> -i <input_file2>

-o output_file

sqlcmdからの出力を受信するファイルを指定します。

-u が指定されている場合は、 output_file は Unicode 形式で格納されます。 ファイル名が無効な場合は、エラー メッセージが生成され、sqlcmd が終了します。 sqlcmd は、同じファイルに対する複数の sqlcmd プロセスの同時書き込みはサポートしていません。 ファイル出力が破損するか、誤っている可能性があります。 -f オプションは、ファイル形式にも関連します。 このファイルが存在しない場合は作成されます。 以前の sqlcmd セッションで同じ名前のファイルが作成されていた場合は、上書きされます。 ここで指定するファイルは stdout ファイルではありません。 stdout ファイルが指定されている場合、このファイルは使用されません。

パスの例:

-o C:< filename>
-o \\<Server>\<Share$>\<filename>
-o "C:\Some Folder\<file name>"

空白を含むファイル パスは、引用符で囲む必要があります。

-r[0 | 1]

エラー メッセージ出力を画面にリダイレクトします (stderr)。 パラメーターを指定しない場合や、0 を指定した場合は、重大度レベル 11 以上のエラー メッセージだけがリダイレクトされます。 1 を指定した場合は、PRINT を含むすべてのエラー メッセージ出力がリダイレクトされます。 -o を使用する場合、このオプションの影響はありません。 既定では、メッセージは stdoutに送られます。

注意

sqlcmd (Go) ユーティリティの場合、-r には引数 0 または 1 が必要です。

-R

適用対象: ODBC sqlcmd のみ。

sqlcmd により、クライアントのロケールに基づいて SQL Server から取得された数値、通貨、日付、および時刻の各列がローカライズされます。 既定では、これらの列はサーバーの地域別設定を使用して表示されます。

-u

input_file の形式に関係なく、 output_fileを Unicode 形式で格納するように指定します。

注意

sqlcmd (Go) ユーティリティの場合、生成される Unicode 出力ファイルに UTF-16 リトル エンディアン バイト オーダー マーク (BOM) が書き込まれています。

クエリ実行オプション

-e

入力スクリプトを標準出力デバイス (stdout) に書き込みます。

I-

適用対象: ODBC sqlcmd のみ。

SET QUOTED_IDENTIFIER 接続オプションを ON に設定します。 既定では、OFF に設定されています。 詳細については、「SET QUOTED_IDENTIFIER (Transact-SQL)」を参照してください。

注意

sqlcmd (Go) ユーティリティで引用符で囲まれた識別子の動作を無効にするには、スクリプトに SET QUOTED IDENTIFIER OFF を追加します。

-q "cmdline query"

sqlcmd の起動時にクエリを実行しますが、クエリの実行が完了しても sqlcmd は終了しません。 セミコロンで区切られた複数のクエリを実行できます。 次の例で示すように、クエリを引用符で囲みます。

コマンド プロンプトに、次のコマンドを入力します。

sqlcmd -d AdventureWorks2022 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"

sqlcmd -d AdventureWorks2022 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
sqlcmd -d AdventureWorks2022 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"

sqlcmd -d AdventureWorks2022 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
sqlcmd -d AdventureWorks2022 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"

sqlcmd -d AdventureWorks2022 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"

重要

クエリでは GO ターミネータを使用しないでください。

このオプションと共に -b を指定すると、 sqlcmd はエラーで終了します。 この記事の他の場所に -b の説明があります。

-Q "cmdline query"

sqlcmd の起動時にクエリを実行し、 sqlcmdを即時終了します。 セミコロンで区切られた複数のクエリを実行できます。

次の例で示すように、クエリを引用符で囲みます。

コマンド プロンプトに、次のコマンドを入力します。

sqlcmd -d AdventureWorks2022 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"

sqlcmd -d AdventureWorks2022 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
sqlcmd -d AdventureWorks2022 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"

sqlcmd -d AdventureWorks2022 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
sqlcmd -d AdventureWorks2022 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"

sqlcmd -d AdventureWorks2022 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"

重要

クエリでは GO ターミネータを使用しないでください。

このオプションと共に -b を指定すると、 sqlcmd はエラーで終了します。 この記事の他の場所に -b の説明があります。

-t query_timeout

コマンド (または Transact-SQL ステートメント) がタイムアウトになるまでの秒数を指定します。このオプションにより、sqlcmd スクリプト変数 SQLCMDSTATTIMEOUT が設定されます。 query_timeout 値が指定されていない場合、コマンドはタイムアウトになりません。query_timeout は、1 から 65534 までの数値である必要があります。 指定した値が数値以外の場合、またはその範囲外の場合、sqlcmd によりエラー メッセージが生成されます。

注意

実際のタイムアウト値は、指定した query_timeout 値より数秒異なる場合があります。

-v var = value [ var = value... ]

sqlcmd スクリプトで使用できる sqlcmd スクリプト変数を作成します。 値に空白が含まれる場合は、値を引用符で囲みます。 複数の <var>="<value>" 値を指定することができます。 指定した値にエラーが生じた場合は、 sqlcmd は、エラー メッセージを生成してから終了します。

sqlcmd -v MyVar1=something MyVar2="some thing"

sqlcmd -v MyVar1=something -v MyVar2="some thing"
sqlcmd -v MyVar1=something MyVar2="some thing"

sqlcmd -v MyVar1=something -v MyVar2="some thing"
sqlcmd -v MyVar1=something MyVar2="some thing"

sqlcmd -v MyVar1=something -v MyVar2="some thing"

-x

sqlcmd ではスクリプト変数が無視されます。 このパラメーターは、標準変数と同じ形式の文字列 ($(<variable_name>)) などを含む INSERT ステートメントが、スクリプトに多数含まれている場合に便利です。

形式のオプション

-h headers

列ヘッダーの間に出力する行数を指定します。 既定では、各クエリの結果に対して、ヘッダーは 1 つだけ表示されます。 このオプションにより、sqlcmd スクリプト変数 SQLCMDHEADERS が設定されます。 ヘッダーを出力しない場合は、 -1 を指定します。 有効でない値があると、sqlcmd はエラー メッセージを生成してから終了します。

-k [1 | 2]

タブ、改行文字などのすべての制御文字を出力から削除します。 このパラメーターにより、データが返されたときの列の形式が維持されます。

  • -k は、制御文字を削除します。
  • -k1 は、各制御文字をスペースに置き換えます。
  • -k2 は、連続する制御文字を 1 つのスペースに置き換えます。

-s col_separator

列の区切り文字を指定します。 既定では、空白になっています。 このオプションにより、sqlcmd スクリプト変数 SQLCMDCOLSEP が設定されます。 アンパサンド (&)、セミコロン (;) など、オペレーティング システムで特別な意味を持つ文字を使用する場合は、その文字を引用符 (") で囲みます。 列の区切り文字には、任意の 8 ビットの文字を指定できます。

-w screen_width

出力用の画面幅を指定します。 このオプションにより、sqlcmd スクリプト変数 SQLCMDCOLWIDTH が設定されます。 列幅は 8 よりも大きくかつ 65536 よりも小さい値にする必要があります。 指定した列幅が範囲外の場合、sqlcmd はエラー メッセージを生成します。 既定の幅は 80 文字です。 指定した列幅を超えると、出力行は次の列に折り返されます。

-W

このオプションは、列から後続の空白を削除します。 他のアプリケーションにエクスポートするデータを準備するときは、-s オプションと同時にこのオプションを使用します。 -y または -Y オプションでは使用できません。

-y variable_length_type_display_width

sqlcmd スクリプト変数 SQLCMDMAXVARTYPEWIDTHを設定します。 既定値は、256 です。 長い可変長のデータ型に返される文字数を制限します。

  • varchar(max)
  • nvarchar(max)
  • varbinary(max)
  • xml
  • ユーザー定義のデータ型 (UDT)
  • text
  • ntext
  • image

UDT は実装によって固定長にもなります。 固定長の UDT の長さが display_width よりも短い場合、返される UDT の値は影響を受けません。 ただし、 display_widthよりも長い場合は、出力は切り捨てられます。

注意事項

返されるデータのサイズによって、サーバーとネットワークの両方に重大なパフォーマンスの問題が発生する可能性があるため、-y 0 オプションは十分注意して使用してください。

-Y fixed_length_type_display_width

sqlcmd スクリプト変数 SQLCMDMAXFIXEDTYPEWIDTHを設定します。 既定値は 0 (無制限) です。 次のデータ型に返される文字数を制限します。

  • char(n)、ここで 1 <= n<= 8000
  • nchar(n)、ただし 1 <= n<= 4000
  • varchar(n)、ただし 1 <= n<= 8000
  • nvarchar(n)、ただし 1 <= n<= 4000
  • varbinary(n)、ただし 1 <= n<= 4000
  • sql_variant

エラー報告のオプション

-b

エラーが発生したときに、sqlcmd を終了し、DOS ERRORLEVEL 値を返すように指定します。 SQL Server のエラー メッセージの重大度が 10 よりも高い場合、ERRORLEVEL 変数に返される値は 1 です。それ以外の場合は、0 の値が返されます。 -b に加えて -V オプションが設定されている場合、-V を使用して設定した値よりも重大度レベルが低いときは、sqlcmd がエラーを報告しません。 コマンド プロンプト バッチ ファイルにより ERRORLEVEL の値をテストすることができ、エラーを適切に処理できます。 sqlcmd は重大度レベル 10 (情報メッセージ) に対してはエラーを報告しません。

sqlcmd スクリプトに正しくないコメントや構文エラーが含まれている場合やスクリプト変数が不足している場合、返される ERRORLEVEL1 です。

-m error_level

stdout に送信されるエラー メッセージを制御します。 重大度レベルがこのレベル以上のメッセージが送信されます。 この値を -1に設定すると、情報メッセージを含めすべてのメッセージが送信されます。 -m-1 の間に空白は使用できません。 たとえば、-m-1 は有効ですが、-m -1 は違います。

このオプションでは、sqlcmd スクリプト変数 SQLCMDERRORLEVEL も設定されます。 この変数の既定値は 0 です。

-V error_severity_level

ERRORLEVEL 変数を設定するために使用される重大度レベルを制御します。 重大度レベルがこの値以上のエラー メッセージによって、ERRORLEVEL が設定されます。 0 より小さい値は 0 と報告されます。 バッチ ファイルおよび CMD ファイルを使用して、ERRORLEVEL 変数の値をテストできます。

その他のオプション

-a packet_size

異なるサイズのパケットを要求します。 このオプションにより、sqlcmd スクリプト変数 SQLCMDPACKETSIZE が設定されます。 packet_size には、512 から 32767 の値を指定する必要があります。 既定値は、4096 です。 大きなパケット サイズを指定すると、GO コマンド間に多数の Transact-SQL ステートメントが含まれているスクリプトの実行パフォーマンスが向上します。 既定値よりも大きいパケット サイズを要求できます。 ただし、要求が拒否された場合、 sqlcmd はサーバーの既定のパケット サイズを使用します。

-c batch_terminator

バッチ ターミネータを指定します。 既定では、GO だけが入力されている行があると、コマンドが終了し、SQL Server に送られます。 バッチ ターミネータをリセットする場合、Transact-SQL の予約キーワードやオペレーティング システムで特別な意味を持つ文字は、先頭に円記号が付いているかどうかに関係なく、使わないでください。

-L[c]

ローカルに構成されたサーバー コンピューターと、ネットワーク上でブロードキャストしているサーバー コンピューター名の一覧を表示します。 このパラメーターは、他のパラメーターと組み合わせて使うことはできません。 一覧表示できるサーバー コンピューターの最大数は 3,000 です。 バッファーのサイズが原因でサーバーの一覧が切り捨てられる場合は、警告メッセージが表示されます。

注意

ネットワーク上のブロードキャストの特性によっては、 sqlcmd は、一部のサーバーからタイムリーな応答を受信できない場合があります。 そのため、返されるサーバーのリストは、このオプションの実行ごとに異なる可能性があります。

省略可能なパラメーター c を指定すると、出力結果には Servers: ヘッダー行が含まれません。このため、各サーバー行は、先頭に空白がない状態で一覧表示されます。 この表示はクリーン アウトプットと呼ばれます。 クリーン アウトプットを使用すると、スクリプト言語の処理パフォーマンスが向上します。

-p[1]

すべての結果セットのパフォーマンス統計を出力します。 パフォーマンス統計の形式の例を次に示します。

Network packet size (bytes): n

x xact[s]:

Clock Time (ms.): total       t1  avg       t2 (t3 xacts per sec.)

各値の説明:

  • x = SQL Server によって処理されるトランザクション数。
  • t1 = すべてのトランザクションにかかる合計時間、
  • t2 = 単一のトランザクションにかかる平均時間。
  • t3 = 1 秒あたりの平均トランザクション数。

すべての時間はミリ秒単位です。

省略可能なパラメーター 1 を指定した場合は、統計の出力形式は、スプレッドシートへ容易にインポートできる、またはスクリプトによって処理できる、コロンで区切られた形式となります。

省略可能なパラメーターが 1以外の値の場合は、エラーが生成され、 sqlcmd は終了します。

-X[1]

sqlcmd がバッチ ファイルから実行される場合に、システムのセキュリティを損なう可能性のあるコマンドを無効にします。 無効なコマンドも認識されます。 sqlcmd は警告メッセージを表示して継続します。 省略可能なパラメーターを 1 に指定すると、 sqlcmd はエラー メッセージを生成して終了します。 -X オプションを使用した場合に無効になるコマンドは次のとおりです。

  • ED
  • !! command

-X オプションを指定すると、環境変数が sqlcmd に渡されなくなります。 また、SQLCMDINI スクリプト変数を使用して指定した、スタートアップ スクリプトも実行できなくなります。 sqlcmd スクリプト変数の詳細については、「sqlcmd - スクリプト変数を使う」を参照してください。

-?

sqlcmd のバージョンと sqlcmd オプションの構文の概要を表示します。

注意

macOS では、代わりに引用符で囲んで sqlcmd '-?' を実行します。

解説

オプションは、構文の例に示されている順序に従って使う必要はありません。

複数の結果が返される場合は、 sqlcmd は同じバッチの各結果セットの間に空白行を 1 行ずつ出力します。 また、<x> rows affected というメッセージは、そのメッセージが実行したステートメントに該当する場合にだけ表示されます。

sqlcmd を対話的に使用するには、コマンド プロンプトで、sqlcmd を、この記事で前に説明した各オプションと共に入力します。 詳細については、「 sqlcmd ユーティリティの使用」を参照してください。

注意

-l-Q-Z 、または -i のオプションを使用すると、 sqlcmd は実行後に終了します。

コマンド環境 (cmd.exebash) での sqlcmd コマンドライン全体の長さは、すべての引数と拡張変数を含めて、内在するオペレーティング システムが決めます。

変数の優先順位 (低から高)

  1. システム レベル環境変数
  2. ユーザー レベル環境変数
  3. sqlcmd の実行前にコマンド プロンプトで行ったコマンド シェル (SET X=Y) の設定
  4. sqlcmd -v X=Y
  5. :Setvar X Y

注意

環境変数を表示するには、[コントロール パネル][システム] アイコンを開き、[詳細設定] タブを選びます。

sqlcmd スクリプト変数

変数 関連するオプション R/W Default
SQLCMDUSER -U R ""
SQLCMDPASSWORD -P -- ""
SQLCMDSERVER -S R "DefaultLocalInstance"
SQLCMDWORKSTATION -H R "ComputerName"
SQLCMDDBNAME -d R ""
SQLCMDLOGINTIMEOUT -l R/W "8" (秒)
SQLCMDSTATTIMEOUT -t R/W "0" = 無制限に待機
SQLCMDHEADERS -H R/W "0"
SQLCMDCOLSEP -S R/W " "
SQLCMDCOLWIDTH -w R/W "0"
SQLCMDPACKETSIZE -a R "4096"
SQLCMDERRORLEVEL -M R/W 0
SQLCMDMAXVARTYPEWIDTH -y R/W "256"
SQLCMDMAXFIXEDTYPEWIDTH -y R/W "0" = 無制限
SQLCMDEDITOR R/W "edit.com"
SQLCMDINI R ""
SQLCMDUSEAAD -G R/W ""

SQLCMDUSERSQLCMDPASSWORD、および SQLCMDSERVER は、:Connect が使用されるときに設定されます。

R は、その値がプログラムの初期化時に一度だけ設定できることを示します。

R/W は、:setvar コマンドを使用して値を変更できること、および後続のコマンドに新しい値が反映されることを示します。

sqlcmd コマンド

sqlcmd では、Transact-SQL ステートメントの他に次のコマンドも使用できます。

GO [ count ]

:List

[:]RESET

:Error

[:]ED

:Out

[:]!!

:Perftrace

[:]QUIT

:Connect

[:]EXIT

:On Error

:r

:Help

:ServerList

:XML [ ON | OFF ]

:Setvar

:Listvar

sqlcmd コマンドを使用するときは、次の点に注意してください。

  • GO を除くすべての sqlcmd コマンドは、コロン (:) によってプレフィックス指定する必要があります。

    重要

    既存の osql スクリプトとの下位互換性を保つために、一部のコマンドはコロンなしで認識され、: によって示されます。

  • sqlcmd コマンドが認識されるのは、コマンドが行の先頭にある場合のみです。

  • すべての sqlcmd コマンドには、大文字と小文字の区別はありません。

  • 各コマンドは個別の行に指定する必要があります。 コマンドの後には、Transact-SQL ステートメントや別のコマンドを指定できません。

  • コマンドは即座に実行されます。 Transact-SQL ステートメントのように、実行バッファーに配置されません。

編集コマンド

[:]ED

テキスト エディターを開始します。 このエディターは、現在の Transact-SQL バッチまたは最後に実行したバッチを編集する場合に使用できます。 最後に実行したバッチを編集するには、最後のバッチの実行が完了した直後に ED コマンドを入力する必要があります。

テキスト エディターは、SQLCMDEDITOR 環境変数で定義されます。 既定のエディターは Edit です。 エディターを変更するには、SQLCMDEDITOR 環境変数を設定します。 たとえば、エディターを Microsoft メモ帳に設定するには、コマンド プロンプトで次のように入力します。

SET SQLCMDEDITOR=notepad

[:]RESET

ステートメント キャッシュをクリアします。

:List

ステートメント キャッシュの内容を出力します。

変数

:Setvar <var> [ "value" ]

sqlcmd スクリプト変数を定義します。 スクリプト変数は $(VARNAME)という形式になります。

変数名では大文字と小文字が区別されません。

スクリプト変数は次の方法で指定できます。

  • コマンド ラインのオプションを暗黙的に使用します。 たとえば、-l オプションでは SQLCMDLOGINTIMEOUT sqlcmd 変数が設定されます。

  • :Setvar コマンドを明示的に使用します。

  • sqlcmdの実行前に環境変数を定義します。

注意

-X オプションを使用すると、環境変数が sqlcmdに渡されなくなります。

:Setvar を使って定義した変数と環境変数が同じ名前の場合は、 :Setvar を使用して定義した変数が優先されます。

変数名には空白文字を含めることはできません。

変数名には、$(var) のような変数表現と同じ形式を使うことはできません。

スクリプト変数の文字列値に空白文字が含まれる場合は、値を引用符で囲みます。 スクリプト変数の値を設定していない場合は、そのスクリプト変数は削除されます。

:Listvar

現在設定されているスクリプト変数の一覧を表示します。

注意

sqlcmdによって設定されたスクリプト変数および :Setvar コマンドを使用して設定されたスクリプト変数のみが表示されます。

出力コマンド

:Error <filename> | STDERR | STDOUT

すべてのエラー出力を、"ファイル名" によって指定されたファイル、stderr、または stdout にリダイレクトします。 :Error コマンドは、1 つのスクリプト内で複数回使用できます。 既定では、エラー出力は stderr に送られます。

  • ファイル名

    出力を受信するファイルを作成して開きます。 ファイルが既に存在している場合は、ファイルは 0 バイトに切り詰められます。 アクセス許可またはその他の理由でファイルが使用できない場合は、出力は切り替えられず、最後に指定した出力先または既定の出力先に送信されます。

  • STDERR

    エラー出力を stderr ストリームに切り替えます。 ストリームがリダイレクトされている場合は、ストリームのリダイレクト先がエラー出力を受信します。

  • STDOUT

    エラー出力を stdout ストリームに切り替えます。 ストリームがリダイレクトされている場合は、ストリームのリダイレクト先がエラー出力を受信します。

:Out <filename> | STDERR | STDOUT

すべてのクエリ結果を、 file nameによって指定されたファイル、または stderrstdoutに作成してリダイレクトします。 既定では、出力は stdout に送られます。 ファイルが既に存在している場合は、ファイルは 0 バイトに切り詰められます。 :Out コマンドは、1 つのスクリプト内で複数回使用できます。

:Perftrace <filename> | STDERR | STDOUT

すべてのパフォーマンス トレース情報を、 file nameによって指定されたファイル、または stderrstdoutに作成してリダイレクトします。 既定では、パフォーマンス トレース出力は stdoutに送られます。 ファイルが既に存在している場合は、ファイルは 0 バイトに切り詰められます。 :Perftrace コマンドは、1 つのスクリプト内で複数回使用できます。

実行制御コマンド

:On Error [ exit | ignore ]

スクリプト実行中またはバッチ実行中のエラー発生時に対応するアクションを設定します。

exit オプションを使用した場合、sqlcmd は該当するエラー値を表示して終了します。

ignore オプションを使用すると、sqlcmd はエラーを無視し、バッチまたはスクリプトの実行を続行します。 既定では、エラー メッセージが出力されます。

[:]QUIT

sqlcmd が終了します。

[:]EXIT [ ( statement ) ]

sqlcmd からの戻り値として SELECT ステートメントの結果を使用できます。 数値の場合、結果行の最終行の第 1 列は、4 バイトの (長) 整数に変換されます。 MS-DOS、Linux、および macOS は、下位バイトを親プロセスやオペレーティング システムのエラー レベルに渡します。 Windows 2000 以降のバージョンでは、4 バイト整数全体が渡されます。 構文は :EXIT(query)です。

次に例を示します。

:EXIT(SELECT @@ROWCOUNT)

バッチ ファイルの一部として、:EXIT パラメーターを含めることもできます。 たとえば、コマンド プロンプトで次のように入力します。

sqlcmd -Q ":EXIT(SELECT COUNT(*) FROM '%1')"

sqlcmd ユーティリティにより、かっこ (()) 内のすべての情報がサーバーに送信されます。 システム ストアド プロシージャで 1 つの値セットを選択し、値を返すように指定した場合、返されるのは選択した値のみです。 かっこ内に何も指定せずに :EXIT() ステートメントを指定すると、バッチ内のそのステートメントより前にあるものすべてを実行し、戻り値を返さずに終了します。

不適切なクエリを指定すると、sqlcmd は戻り値を返さずに終了します。

EXIT 形式のリストを次に示します。

  • :EXIT

    バッチを実行せずに直ちに終了し、値を返しません。

  • :EXIT( )

    バッチを実行してから終了し、値を返しません。

  • :EXIT(query)

    クエリを含むバッチを実行し、クエリの結果を返して終了します。

RAISERRORsqlcmd スクリプトの中で使用し、状態 127 が発生すると、sqlcmd は終了し、メッセージ ID をクライアントに返します。 次に例を示します。

RAISERROR(50001, 10, 127)

このエラーにより、sqlcmd スクリプトは終了し、メッセージ ID 50001 がクライアントに返されます。

戻り値 -1 から -99 は SQL Server によって予約済みです。また、sqlcmd では次のような追加の戻り値を定義しています。

戻り値 説明
-100 戻り値を選択する前に、エラーが発生した。
-101 戻り値を選択するときに、行が見つからなかった。
-102 戻り値を選択するときに、変換エラーが発生した。

GO [count]

GO は、バッチの終わりとキャッシュされた Transact-SQL ステートメントの実行を知らせます。 バッチは、個別のバッチとして複数回実行されます。 1 回のバッチで変数を複数回宣言することはできません。

その他のコマンド

:r <filename>

filename によって指定されたファイルを基に、追加の Transact-SQL ステートメントと sqlcmd コマンドを解析し、ステートメント キャッシュ内に登録します。 filename は、sqlcmd が実行されたスタートアップ ディレクトリを基準にして読み取られます。

GO が最後に記述されていない Transact-SQL ステートメントがファイルに含まれている場合は、その行の GO の後に :r を入力する必要があります。

ファイルは、バッチ ターミネータが検出された後に読み取られ、実行されます。 :r コマンドは複数発行できます。 ファイルには、バッチ ターミネータ GO を含む任意の sqlcmd コマンドを含めることができます。

注意

対話モードで表示される行数は、:r コマンドが検出されるたびに、1 行ずつ増えます。 :r コマンドは、リスト コマンドの出力に表示されます。

:ServerList

ローカルに構成されたサーバーと、ネットワーク上でブロードキャストしているサーバー名の一覧を表示します。

:Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password]]

SQL Server のインスタンスに接続します。 また、現在の接続を終了します。

タイムアウト オプション :

動作
0 待機状態を維持します
n>0 n 秒間待機します

SQLCMDSERVER スクリプト変数により、現在のアクティブな接続が反映されます。

timeout を指定しないと、SQLCMDLOGINTIMEOUT 変数の値が既定値になります。

user_name のみを指定した場合 (オプションとして指定した場合も、環境変数として指定した場合も)、ユーザーはパスワードの入力を要求されます。 SQLCMDUSER または SQLCMDPASSWORD の環境変数が設定されている場合、ユーザーにプロンプトは表示されません。 オプションも環境変数も指定しない場合は、Windows 認証モードを使用してサインインします。 たとえば、統合セキュリティを使用して、SQL Server myserver のインスタンス instance1 に接続するには、次のコマンドを使用します。

:connect myserver\instance1

スクリプト変数を使用して myserver の既定のインスタンスに接続するには、次の設定を使用します。

:setvar myusername test
:setvar myservername myserver
:connect $(myservername) $(myusername)

[:]!! command

オペレーティング システムのコマンドを実行します。 オペレーティング システムのコマンドを実行するには、行頭に 2 つの感嘆符 ( !! ) を入力し、続けてオペレーティング システムのコマンドを入力します。 次に例を示します。

:!! dir

注意

コマンドは sqlcmd を実行中のコンピューター上で実行されます。

:XML [ ON | OFF ]

詳細については、この記事の「XML 出力形式」と「JSON 出力形式」を参照してください。

:Help

sqlcmd コマンドと各コマンドの短い説明を一覧表示します。

sqlcmd のファイル名

sqlcmd の入力ファイルは -i オプションまたは :r コマンドで指定できます。 出力ファイルは -o オプションまたは :Error:Out 、および :Perftrace コマンドで指定できます。 指定するファイルについてのガイドラインを次に示します。

  • :Error:Out および :Perftrace では、個別の "ファイル名" の値を使用する必要があります。 同じ filename を使用すると、各コマンドからの入力が混在する場合があります。

  • ローカル コンピューターの sqlcmd からリモート サーバー上の入力ファイルが呼び出され、ファイルに :Out c:\OutputFile.txt のようにドライブ パスが含まれていると、出力ファイルはリモート サーバーではなく、ローカル コンピューター上に作成されます。

  • 有効なファイル パスは、C:\<filename>\\<Server>\<Share$>\<filename>"C:\Some Folder\<file name>" などです。 パスに空白が含まれる場合は、引用符を使用します。

  • 各新規 sqlcmd セッションにより、同じ名前の既存のファイルが上書きされます。

情報メッセージ

sqlcmd は、サーバーから送信されたすべての情報メッセージを出力します。 次の例では、Transact-SQL ステートメントが実行された後、情報メッセージが出力されます。

sqlcmdを開始します。 sqlcmd コマンド プロンプトで次のクエリを入力します。

USE AdventureWorks2022;
GO

ENTER キーを押すと、次の情報メッセージが出力されます。

Changed database context to 'AdventureWorks2022'.

Transact-SQL クエリからの出力形式

まず、sqlcmd は SELECT リストで指定した列名を含む列ヘッダーを出力します。 列名は、SQLCMDCOLSEP の文字を使用して区切られます。 既定では、空白です。 列名が列幅よりも短い場合は、出力は次の列まで空白で埋められます。

この行の次には区切り行が出力されます。区切り行は、連続したダッシュ文字です。 次に出力の例を示します。

sqlcmdを開始します。 sqlcmd コマンド プロンプトで次のクエリを入力します。

USE AdventureWorks2022;
SELECT TOP (2) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO

Enter キーを押すと、次の結果セットが返されます。

BusinessEntityID FirstName    LastName
---------------- ------------ ----------
285              Syed         Abbas
293              Catherine    Abel
(2 row(s) affected)

BusinessEntityID 列には 4 文字分の幅しかありませんが、長い列名に合わせるため拡張されています。 既定では、出力は 80 文字で終了します。 この幅は、-w オプションを使用するか、SQLCMDCOLWIDTH スクリプト変数を設定することで変更できます。

XML 出力形式

FOR XML 句からの結果である XML 出力は、連続するストリームでフォーマットされずに出力されます。

XML 出力を行うには、 :XML ONコマンドを使用します。

注意

sqlcmd は、通常の形式のエラー メッセージを返します。 エラー メッセージは XML 形式の XML テキスト ストリームでも出力されます。 :XML ONを使用すると、 sqlcmd は情報メッセージを表示しません。

XML モードをオフにするには、:XML OFF コマンドを使用します。

:XML OFF コマンドは sqlcmd を行指向の出力に切り替えるので、:XML OFF コマンドの実行前に GO コマンドは指定しないでください。

XML (ストリーム入力) データと行セットのデータを混在させることはできません。 XML ストリームを出力する Transact-SQL ステートメントの実行前に、:XML ON コマンドが実行されていない場合は、正しく出力されません。 :XML ON コマンドが実行されると、通常の行セットを出力する Transact-SQL ステートメントは実行できません。

注意

:XML コマンドは SET STATISTICS XML ステートメントをサポートしません。

JSON 出力形式

JSON 出力を行うには、 :XML ONコマンドを使用します。 そうでない場合、出力には、列名と JSON テキストの両方が含まれます。 この出力は、有効な JSON ではありません。

XML モードをオフにするには、:XML OFF コマンドを使用します。

詳細については、この記事の「XML 出力形式」を参照してください。

Microsoft Entra 認証を使用する

Microsoft Entra 認証を使用した例:

sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net  -G  -l 30

sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net -G -U bob@contoso.com -P MyAzureADPassword -l 30
sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net  -G  -l 30

sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net -G -U bob@contoso.com -P MyAzureADPassword -l 30
sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net  -G  -l 30

sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net -G -U bob@contoso.com -P MyAzureADPassword -l 30

sqlcmd のベスト プラクティス

次の説明を参考にして、セキュリティと効率を最大にしてください。

  • 統合セキュリティを使用します。

  • 自動化された環境では -X[1] を使用します。

  • 適切なファイル システム権限を使用して、入力ファイルと出力ファイルのセキュリティを保護します。

  • パフォーマンスを向上させるには、複数のセッションではなく、1 つの sqlcmd セッションの中で、できるだけ作業するようにします。

  • バッチまたはクエリ実行のタイムアウト値を、推定所要時間よりも長めに設定します。

次の説明を参考にして、正確さを最大限に高めます。

  • -V16 を使用して、重大度 16 レベルのメッセージをログに記録します。 重大度 16 のメッセージは、ユーザーが訂正できる一般的なエラーを示します。

  • プロセスが終了した後、終了コードと DOS ERRORLEVEL 変数を確認します。 sqlcmd は通常 0 を返しますが、それ以外の場合は -V で構成されたとおりに ERRORLEVEL が設定されます。 つまり、ERRORLEVEL が SQL Server から報告されるエラー番号と同じ値であると想定しないでください。 エラー番号は、システム関数 @@ERROR に対応する SQL Server 固有の値です。 ERRORLEVEL は、sqlcmd が終了した理由を示す sqlcmd 固有の値であり、その値は -b コマンド ライン引数を指定することによって影響を受けます。

終了コードおよび DOS ERRORLEVEL のチェックと組み合わせて -V16 を使用すると、自動化された環境 (特に運用リリース前の品質ゲート) でエラーをキャッチできます。