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 |
パラメータなし |