我有一个设计为由sqlcmd执行的 SQL 脚本,以及一个使用正确参数执行 sqlcmd 的命令脚本。
我想将命令脚本转换为使用Invoke-Sqlcmd而不是 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。它应该与命令脚本执行相同的操作,使用 Invoke-Sqlcmd 而不是 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
PowerShell 脚本引发错误,因为 Invoke-Sqlcmd 在目录中找不到输入文件,该Z:\
目录恰好是默认工作目录。
命令脚本在当前工作目录中找到了该脚本。
如何让 Invoke-Sqlcmd 使用当前工作目录而不是默认工作目录?