2012-01-04 30 views
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'

如果($ LASTEXITCODE -ne 0) { throw「Script failed。Return code is $ LASTEXITCODE。」 }

失敗的表面上隨機的性質造成了很大的痛苦。我無法確定錯誤是否是SQL2008,SQLCMD(儘管我得到與osql.exe相同的行爲)或以某種方式耦合到了powershell。

sqlcmd正在執行的實際sql似乎與問題無關,因爲sql腳本會執行一段時間然後失敗。

相同的故障已經看到許多不同的工作站和服務器(Win7的,Win2003的和的Win2008)

有關如何跟蹤下來將非常感謝任何指導。

+1

可能是一個已知問題:[see:connect.microsoft.com](http://connect.microsoft.com/PowerShell/feedback/details/496326/stability-problem-any-application-run-fails-with-lastexitcode-1073741502#details) – 2012-01-04 14:08:04

+0

@ user978511 - 它不是特定於應用程序的。請注意jon的鏈接。 – JNK 2012-01-04 14:21:08

+0

@jon Z.感謝您的鏈接。很好的發現。很高興我在這個瘋狂中並不孤單。 – 2012-01-04 14:52:04

回答

1

如果您使用Powershell,請勿使用sqlcmd和命令行!

V2中有非常好的內置工具,可以讓您與SQL Server進行更強大的交互,並且不要求您解析返回代碼的文本以檢查錯誤 - 它們實際上會返回適當的錯誤碼。

Here's a technet article on Invoke-SQLCmd

請記住,你需要首先加載snapins:

Add-PSSnapin SqlServerProviderSnapin100 
Add-PSSnapin SqlServerCmdletSnapin100 
+0

只有在大多數情況下不在同一個盒子上安裝SQL Server時,它纔會起作用 – 2012-01-04 14:09:50

+0

不正確。您需要安裝SSMS,但不是完整的服務器。我每天都在連接到遠程服務器的開發機器上使用它。 – JNK 2012-01-04 14:10:54

+0

謝謝@JNK。我查看了Invoke-SQLCMD – 2012-01-04 14:56:21

0

的根源實際上是解釋elsewhere on here

退出代碼-1073741502是十六進制0xC0000142(status_dll_init_failed)。 微軟的KB2701373解決了Console.WriteMicrosoft.powershell.consolehost.dll中產生的泄漏手柄問題。

Side-Note: Internet上的一些「修復」涉及到做不同的事情,然後重新啓動PowerShell。然而,實際重新啓動PowerShell是什麼解決了這個問題(暫時)

相關問題