PowerShell执行osql或sqlcmd时的$LastExitCode为-1073741502。

3
我已经编写了一个PowerShell脚本来调用sqlcmd.exe针对远程SQL服务器执行SQL脚本。PowerShell脚本会检查$LASTEXITCODE。如果$LASTEXITCODE是非零值,我就会抛出“脚本失败。返回代码为$LASTEXITCODE。”的异常信息。
该脚本被多次使用以执行不同的SQL脚本,并且是部署期间运行的一系列PowerShell脚本的一部分。
引用块: 该脚本通常可以正常运行,但偶尔会以返回代码-1073741502的形式随机失败。
这种情况只发生在升级到SQL2008之后,我无法通过手动运行单个PowerShell脚本或手动运行SQL CMD脚本来重现它。
这是PowerShell命令:
引用块: &'sqlcmd.exe'-S $databaseServer-r-b-E-i'$scriptFullPath' if($LASTEXITCODE -ne 0) { throw "Script failed. Return code is $LASTEXITCODE." }
失败的看似随机性导致了很多困扰。我无法确定错误是否与SQL2008、SQLCMD(尽管我使用osql.exe时也会出现相同的行为)或某种方式与PowerShell耦合有关。
由于sqlcmd正在执行的实际SQL似乎与问题无关,因此SQL脚本将会执行一段时间然后失败。
在许多不同的工作站和服务器(Win7、Win2003和Win2008)上都看到了相同的故障。
非常感谢您提供有关如何跟踪此问题的任何指导。

1
可能是一个已知的问题:请参见:connect.microsoft.com - jon Z
@user978511 - 这不是特定于应用程序的。请注意Jon的链接。 - JNK
@jon Z. 感谢你提供的链接,找得真好。很高兴我不是唯一一个陷入这种疯狂中的人。 - richard wadsworth
2个回答

1

如果你正在使用Powershell,不要使用sqlcmd和命令行!

V2中有非常好的内置工具,可以让你与SQL Server进行更强大的交互,并且不需要解析返回代码的文本以检查错误-它们实际上返回正确的错误代码。

这里是一个关于Invoke-SQLCmd的technet文章

请记住,您需要先加载snapins:

Add-PSSnapin SqlServerProviderSnapin100
Add-PSSnapin SqlServerCmdletSnapin100

仍有功能受限。使用 Invoke-Sqlcmd 也可以完成许多 sqlcmd 可以完成的任务。 - Monso
@Monso - 试一下吧。如果你想在PS中运行SQL,它可以满足你的所有需求。 - JNK
我进行了研究并尝试了一些方法,但是我无法让它们正常工作。SqlCmd仍然提供更多的选项,但它不能满足我的需求。 - Monso
@Monso,你能具体说明一下“无论什么”吗? - JNK
Invoke-Sqlcmd唯一引人注目的特点是它将结果集作为对象返回,而不是文本。如果您不需要操作结果集,请使用sqlcmd.exe,因为它更健壮且得到更好的支持。 - Iain Samuel McLean Elder
显示剩余4条评论

0

根本原因其实是解释在这里的其他位置上。

退出码-1073741502是十六进制中的0xC0000142(status_dll_init_failed)。 微软的KB2701373解决了由Console.WriteMicrosoft.powershell.consolehost.dll中引起的泄漏句柄。

附注:互联网上的一些“修复”涉及以不同的方式操作,然后重新启动PowerShell。然而,实际上重新启动PowerShell才可以解决问题(暂时)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接