Invoke-Sqlcmd コマンドレットの使用

Invoke-Sqlcmd は、SQL Server コマンドレットであり、言語 (Transact-SQL および XQuery) のステートメントおよび sqlcmd ユーティリティでサポートされているコマンドを含んだスクリプトを実行します。

Invoke-Sqlcmd の使用

Invoke-Sqlcmd コマンドレットを使用すると、Windows PowerShell 環境で sqlcmd スクリプト ファイルを実行できます。sqlcmd で実行できる処理の多くは、Invoke-Sqlcmd を使用しても実行できます。

次の例では、Invoke-Sqlcmd を呼び出して単純なクエリを実行しています。これは、sqlcmd-Q および -S オプションを指定する場合と同様です。

Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"

次の例では、Invoke-Sqlcmd を呼び出し、入力ファイルを指定して、出力をファイルにパイプしています。これは、sqlcmd-i および -o オプションを指定する場合と同様です。

Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -filePath "C:\MyFolder\TestSQLCmd.rpt"

次の例では、Windows PowerShell 配列を使用して複数の sqlcmd スクリプト変数を Invoke-Sqlcmd に渡しています。SELECT ステートメントで sqlcmd スクリプト変数を識別する "$" 文字をエスケープするために、Windows PowerShell のバック チック "`" エスケープ文字が使用されています。

$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"
Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray

次の例では、SQL Server プロバイダを使用してデータベース エンジンのインスタンスに移動した後に、Windows PowerShell の Get-Item コマンドレットを使用してそのインスタンスの SMO サーバー オブジェクトを取得し、Invoke-Sqlcmd に渡しています。

Set-Location SQLSERVER:\SQL\MyComputer\MyInstance
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance (Get-Item .)

-Query パラメータは位置で指定するパラメータであり、名前を指定する必要はありません。Invoke-Sqlcmd に渡された最初の文字列が無名の場合、その文字列は -Query パラメータとして扱われます。

Invoke-Sqlcmd "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"

Invoke-Sqlcmd のパス コンテキスト

-Database パラメータを使用しない場合、Invoke-Sqlcmd のデータベース コンテキストは、コマンドレットが呼び出されたときにアクティブなパスによって設定されます。

パス

データベース コンテキスト

SQLSERVER: 以外のドライブで始まります。

ローカル コンピュータ上の既定のインスタンスのログイン ID の既定のデータベースです。

SQLSERVER:\SQL

ローカル コンピュータ上の既定のインスタンスのログイン ID の既定のデータベースです。

SQLSERVER:\SQL\ComputerName

指定したコンピュータ上の既定のインスタンスのログイン ID の既定のデータベースです。

SQLSERVER:\SQL\ComputerName\InstanceName

指定したコンピュータ上の指定したインスタンスのログイン ID の既定のデータベースです。

SQLSERVER:\SQL\ComputerName\InstanceName\Databases

指定したコンピュータ上の指定したインスタンスのログイン ID の既定のデータベースです。

SQLSERVER:\SQL\ComputerName\InstanceName\Databases\DatabaseName

指定したコンピュータ上の指定したインスタンスの指定したデータベースです。これは、より長いパス (たとえばデータベース内の Tables ノードや Columns ノードを指定するパス) にも適用されます。

たとえば、ローカル コンピュータの既定のインスタンスの Windows アカウントの既定のデータベースが master であるとします。次のコマンドを実行すると、master が返されます。

Set-Location SQLSERVER:\SQL
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"

次のコマンドを実行すると、AdventureWorks が返されます。

Set-Location SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks\Tables\Person.Contact
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"

Invoke-Sqlcmd は、パス データベース コンテキストを使用するときに警告を表示します。-SuppressProviderContextWarning パラメータを使用すると、警告メッセージが出力されないようにすることができます。-IgnoreProviderContext パラメータを使用すると、Invoke-Sqlcmd を実行するときに常にログインの既定のデータベースが使用されます。

Invoke-Sqlcmd と sqlcmd ユーティリティの比較

Invoke-Sqlcmd では、sqlcmd ユーティリティを使用して実行できるスクリプトの多くを実行できます。ただし、Invoke-Sqlcmd が実行される Windows PowerShell 環境は、sqlcmd が実行されるコマンド プロンプト環境とは異なります。Invoke-Sqlcmd の動作は、Windows PowerShell 環境で機能するように変更されています。

すべての sqlcmd コマンドが Invoke-Sqlcmd で実装されるわけではありません。実装されないコマンドには、:!!:connect:error:out:ed:list:listvar:reset:perftrace、および :serverlist があります。

Invoke-Sqlcmd では sqlcmd 環境または SQLCMDDBNAME や SQLCMDWORKSTATION などのスクリプト変数が初期化されません。

Invoke-Sqlcmd では、Windows PowerShell の -Verbose 共通パラメータを指定しない限り、PRINT ステートメントの出力などのメッセージが表示されません。たとえば、次のように指定します。

Invoke-Sqlcmd -Query "PRINT N'abc';" -Verbose

sqlcmd のすべてのパラメータが Windows PowerShell 環境で必要となるわけではありません。たとえば、Windows PowerShell ではコマンドレットからのすべての出力の書式が自動的に設定されるため、書式設定オプションを指定する sqlcmd のパラメータは Invoke-Sqlcmd には実装されていません。Invoke-Sqlcmd のパラメータと sqlcmd のオプションの関係を次の表に示します。

説明

sqlcmd オプション

Invoke-Sqlcmd パラメータ

サーバーとインスタンスの名前

-S

-ServerInstance

使用する初期データベース

-d

-Database

指定したクエリの実行と終了

-Q

-Query

SQL Server 認証ログイン ID

-U

-Username

SQL Server 認証パスワード

-P

-Password

変数の定義

-v

-Variable

クエリのタイムアウト間隔

-t

-QueryTimeout

エラー発生時の実行停止

-b

-AbortOnError

専用管理者接続

-A

-DedicatedAdministratorConnection

対話型コマンド、スタートアップ スクリプト、および環境変数の無効化

-X

-DisableCommands

変数の代入の無効化

-x

-DisableVariables

レポートする最小重大度レベル

-V

-SeverityLevel

レポートする最小エラー レベル

-m

-ErrorLevel

ログインのタイムアウト間隔

-l

-ConnectionTimeout

ホスト名

-H

-HbostName

パスワードの変更と終了

-Z

-NewPassword

クエリが含まれている入力ファイル

-i

-InputFile

文字出力の最大長

-w

-MaxCharLength

バイナリ出力の最大長

-w

-MaxBinaryLength

SSL 暗号化を使用した接続

パラメータなし

-EncryptConnection

エラーの表示

パラメータなし

-OutputSqlErrors

stderr へのメッセージの出力

-r

パラメータなし

クライアントの地域別設定の使用

-R

パラメータなし

指定したクエリの実行と実行の継続

-q

パラメータなし

出力データに使用するコード ページ

-f

パラメータなし

パスワードの変更と実行の継続

-z

パラメータなし

パケット サイズ

-a

パラメータなし

列の区切り

-s

パラメータなし

出力ヘッダーの制御

-h

パラメータなし

制御文字の指定

-k

パラメータなし

固定長表示幅

-Y

パラメータなし

可変長表示幅

-y

パラメータなし

入力のエコー

-e

パラメータなし

引用符で囲まれた識別子の有効化

-I

パラメータなし

末尾のスペースの削除

-W

パラメータなし

インスタンスの一覧表示

-L

パラメータなし

出力の形式を Unicode に設定

-u

パラメータなし

統計情報の印刷

-p

パラメータなし

コマンドの終了

-c

パラメータなし

Windows 認証を使用した接続

-E

パラメータなし