sqlcmdによって実行されるように設計されたSQLスクリプトと、正しいパラメーターを使用してsqlcmdを実行するコマンドスクリプトがあります。
コマンドスクリプトを、 sqlcmdの代わりにInvoke-Sqlcmdを使用するPowerShellスクリプトに変換したいと思います。
SQLスクリプト、コマンドスクリプト、および新しいPowerShellスクリプトはすべてディレクトリにありC:\Users\iain.CORP\SqlcmdQuestion
ます。
SQLスクリプト
SQLスクリプトはと呼ばれExampleQuery.sql
ます。文字列リテラルを選択します。文字列リテラルの値は、実行時にsqlcmdによってComputerName
sqlcmdスクリプト変数の値に設定されます。コードは次のようになります。
SELECT '$(ComputerName)';
コマンドスクリプト
コマンドスクリプトはと呼ばれExecQuery.cmd
ます。sqlcmdを呼び出して実行ExampleQuery.sql
し、スクリプト変数ComputerName
の値を環境変数の値に設定しますCOMPUTERNAME
。コードは次のようになります。
sqlcmd -i ExampleQuery.sql -v ComputerName = %COMPUTERNAME%
コマンドプロンプトを開くと、デフォルトの作業ディレクトリはC:\Users\iain.CORP
です。をファイルを含むディレクトリに変更し、コマンドスクリプトを実行します。
cd C:\Users\iain.CORP\SqlcmdQuestion
ExecQuery.cmd
この出力が表示されます:
---------
SKYPC0083
(1 rows affected)
スクリプトは、sqlcmdによって設定された文字列リテラルを正常に選択します。
PowerShellスクリプト
PowerShellスクリプトはExecQuery.ps1と呼ばれます。sqlcmdの代わりにInvoke-Sqlcmdを使用して、コマンドスクリプトと同じことを行うことになっています。コードは次のようになります。
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
Invoke-Sqlcmd -InputFile 'ExampleQuery.sql' -Variable "ComputerName = $Env:COMPUTERNAME"
PowerShellプロンプトを開くと、デフォルトの作業ディレクトリはZ:\
です。ファイルを含むディレクトリに移動し、PowerShellスクリプトを実行します。
cd C:\Users\iain.CORP\SqlcmdQuestion
.\ExecQuery.ps1
この出力が表示されます:
Invoke-Sqlcmd : Could not find file 'Z:\ExampleQuery.sql'.
At C:\Users\iain.CORP\SqlcmdQuestion\ExecQuery.ps1:4 char:14
+ Invoke-Sqlcmd <<<< -InputFile 'ExampleQuery.sql' -Variable "ComputerName = $Env:COMPUTERNAME"
+ CategoryInfo : InvalidResult: (:) [Invoke-Sqlcmd], FileNotFoundException
+ FullyQualifiedErrorId : ExecutionFailed,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
Invoke-SqlcmdがZ:\
、デフォルトの作業ディレクトリであるディレクトリ内の入力ファイルを見つけることができないため、PowerShellスクリプトでエラーが発生します。
コマンドスクリプトは、現在の作業ディレクトリでスクリプトを見つけました。
Invoke-Sqlcmdにデフォルトの作業ディレクトリの代わりに現在の作業ディレクトリを使用させるにはどうすればよいですか?