Invoke-Sqlcmd将脚本保存在PS SQLSERVER:\>'提示

时间:2018-01-19 11:30:14

标签: sql-server powershell sqlcmd cmdlets

我有一个查询MS SQL数据库的脚本如下:

$query = "SELECT Path FROM repoLocations WHERE hostId = '$($hostId)'"
$results = Invoke-Sqlcmd -Query $query -ServerInstance $dbHost -Database $dbName -Username $dbUser -Password $dbPass -ErrorAction Stop

这个问题对于一个小问题非常好。在新打开的PowerShell控制台会话中,第一次运行脚本或实际上使用Invoke-Sqlcmd的任何脚本时,会有几秒钟的延迟,可能是在完成之前模块加载的位置。 SQL查询确实有效并始终返回正确的结果,但在第一次运行时,提示符将保留在:

PS SQLSERVER: \>

然后导致后续文件操作失败。

我有一个解决方法/解决方案,即在Invoke-Sqlcmd之后立即添加以下代码行,这样可以使脚本和提示符每次都按预期工作:

$query = "SELECT Path FROM repoLocations WHERE hostId = '$($hostId)'"
$results = Invoke-Sqlcmd -Query $query -ServerInstance $dbHost -Database $dbName -Username $dbUser -Password $dbPass -ErrorAction Stop
Set-Location -Path $PSScriptRoot

只要我使用相同的PowerShell会话,问题就不会再发生,并且SQL命令之前的暂停不存在。

还有许多类似主题的其他问题包含“变通办法”,但我很好奇是否有更好的修复,可能是在开始时预加载SQL cmdlet程序前的脚本?如果没有,我将需要在脚本可能使用的每Set-Location处使用Invoke-Sqlcmd

2 个答案:

答案 0 :(得分:0)

我之前遇到过类似的问题。你是对的。执行PS SQLSERVER: \>后,脚本的路径将更改为Invoke-Sqlcmd。就我而言,我在脚本中也有其他操作,需要使用像Get-ChildItemGet-Content这样的cmdlet。正如所料,这些命令不起作用,因为路径不是Windows Directory路径。

在这种情况下,我在push-location之后使用了Invoke-Sqlcmd

$query = "SELECT Path FROM repoLocations WHERE hostId = '$($hostId)'"
$results = Invoke-Sqlcmd -Query $query -ServerInstance $dbHost -Database $dbName -Username $dbUser -Password $dbPass -ErrorAction Stop
Push-Location -Path $env:USERPROFILE

答案 1 :(得分:0)

  

是否可能在执行程序之前在脚本开始处预加载SQL cmdlet?

那是我的解决办法。

    try { Push-Location \ # importing sqlps switches you to the sql psdrive...
        Import-Module SQLPS
    } finally { Pop-Location }

此实现的好处是脚本可以Pop-Location将您带回原来的位置。