Invoke-Sqlcmd は、 sqlcmd ユーティリティでサポートされている言語 (Transact-SQL および XQuery) のステートメントとコマンドを含むスクリプトを実行する SQL Server コマンドレットです。
Invoke-Sqlcmd の使用
Invoke-Sqlcmd コマンドレットを使用すると、Windows PowerShell 環境で sqlcmd スクリプト ファイルを実行できます。 sqlcmd でできることの多くは、Invoke-Sqlcmd を使用して実行することもできます。
これは、-Q オプションと -S オプションを使用して sqlcmd を指定するのと同様に、Invoke-Sqlcmd を呼び出して単純なクエリを実行する例です。
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
これは、Invoke-Sqlcmd を呼び出し、入力ファイルを指定し、出力をファイルにパイプ処理する例です。これは、-i および -o オプションで sqlcmd を指定するのと似ています。
Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -FilePath "C:\MyFolder\TestSQLCmd.rpt"
これは、Windows PowerShell 配列を使用して、複数の sqlcmd スクリプト変数を Invoke-Sqlcmd に渡す例です。 SELECT ステートメント内の sqlcmd スクリプト変数を識別する "$" 文字は、PowerShell バックティック "'" エスケープ文字を使用してエスケープされています。
$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"
Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray
これは、Windows PowerShell 用 SQL Server プロバイダーを使用してデータベース エンジンのインスタンスに移動した後、Windows PowerShell Get-Item コマンドレットを使用してインスタンスの SMO Server オブジェクトを取得し、 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 | 指定したコンピューター上の指定したインスタンス内の指定したデータベース。 これは、データベース内の [テーブル] ノードと [列] ノードを指定するパスなど、長いパスにも適用されます。 |
たとえば、ローカル コンピューターの既定のインスタンスの Windows アカウントの既定のデータベースがマスターであるとします。 その後、次のコマンドは master を返します。
Set-Location SQLSERVER:\SQL
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
次のコマンドは AdventureWorks2012 を返します。
Set-Location SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks2012\Tables\Person.Person
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
Invoke-Sqlcmd は、パス データベース コンテキストを使用するときに警告を表示します。 -SuppressProviderContextWarning パラメーターを使用して、警告メッセージをオフにすることができます。 -IgnoreProviderContext パラメーターを使用して、ログインに常に既定のデータベースを使用するように Invoke-Sqlcmd に指示できます。
Invoke-Sqlcmd と sqlcmd ユーティリティの比較
Invoke-Sqlcmd を使用すると、 sqlcmd ユーティリティを使用して実行できるスクリプトの多くを実行できます。 ただし、Invoke-Sqlcmd は、sqlcmd を実行するコマンド プロンプト環境とは異なる Windows PowerShell 環境で実行されます。 Invoke-Sqlcmd の動作は、Windows PowerShell 環境で動作するように変更されました。
すべての sqlcmd コマンドが Invoke-Sqlcmd に実装されているわけではありません。 実装されていないコマンドには、 :!!、 :connect、 :error、 :out、 :ed、 :list、 :listvar、 :reset、 :p erftrace、 および :serverlist があります。
Invoke-Sqlcmd では、 sqlcmd 環境や SQLCMDDBNAME や SQLCMDWORKSTATION などのスクリプト変数は初期化されません。
Windows PowerShell -Verbose 共通パラメーターを指定しない限り、Invoke-Sqlcmd は PRINT ステートメントの出力などのメッセージを表示しません。 例えば次が挙げられます。
Invoke-Sqlcmd -Query "PRINT N'abc';" -Verbose
PowerShell 環境ですべての sqlcmd パラメーターが必要なわけではありません。 たとえば、Windows PowerShell ではコマンドレットからのすべての出力が書式設定されるため、書式設定オプションを指定する sqlcmd パラメーターは Invoke-Sqlcmd には実装されません。 次の表は、 Invoke-Sqlcmd パラメーターと sqlcmd オプションの関係を示しています。
説明 | sqlcmd オプション | Invoke-Sqlcmd パラメーター |
---|---|---|
サーバーとインスタンスの名前。 | -S | サーバインスタンス |
使用する初期データベース。 | -d | -データベース |
指定したクエリを実行して終了します。 | -Q | -クエリ |
SQL Server 認証ログイン ID。 | -U | -ユーザー名 |
SQL Server 認証パスワード。 | -P | -パスワード |
変数の定義。 | -v | -変数 |
クエリのタイムアウト間隔。 | -t | -クエリタイムアウト |
エラーで実行を停止する | -b | -AbortOnError |
専用管理者接続。 | -ある | -専用管理者接続 |
対話型コマンド、スタートアップ スクリプト、環境変数を無効にします。 | -X | -コマンド無効化 |
変数の代入の無効化 | -X | -変数を無効化 |
報告する最小重大度レベル。 | -V | -SeverityLevel |
報告する最小エラー レベル。 | -m | -ErrorLevel |
ログイン タイムアウト間隔。 | -l | -ConnectionTimeout |
ホスト名。 | -H | -ホスト名 |
パスワードの変更と終了 | -Z | 新しいパスワード |
クエリを含む入力ファイル | -アイ | -入力ファイル |
文字出力の最大長。 | -w | -MaxCharLength |
バイナリ出力の最大長。 | -w | -MaxBinaryLength |
SSL 暗号化を使用して接続します。 | パラメーターなし | -EncryptConnection |
エラーを表示する | パラメーターなし | SQLエラーを出力する |
stderr にメッセージを出力します。 | -r | パラメーターなし |
クライアントの地域設定を使用する | -R | パラメーターなし |
指定したクエリを実行し、引き続き実行します。 | -q | パラメーターなし |
出力データに使用するコード ページ。 | -f | パラメーターなし |
パスワードを変更して実行を続ける | -Z | パラメーターなし |
パケット サイズ | -ある | パラメーターなし |
列の区切り | -s | パラメーターなし |
出力ヘッダーを制御する | -h | パラメーターなし |
制御文字を指定する | -k | パラメーターなし |
固定長表示幅 | -Y | パラメーターなし |
ディスプレイの可変長幅 | -y | パラメーターなし |
エコー入力 | -e | パラメーターなし |
引用符で囲まれた識別子を有効にする | -私 | パラメーターなし |
末尾のスペースを削除する | -w | パラメーターなし |
インスタンスの一覧表示 | -L | パラメーターなし |
出力を Unicode として書式設定する | -u | パラメーターなし |
統計情報の印刷 | -p | パラメーターなし |
コマンドの終了 | -c | パラメーターなし |
Windows 認証を使用して接続する | -E | パラメーターなし |