powershell $LastExitCode -1073741502 при вызове osql или sqlcmd
Я написал сценарий 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 "Сценарий не выполнен. Код возврата - $LASTEXITCODE." }
Казалось бы, случайный характер неудачи вызывает много боли. Я не могу определить, является ли ошибка SQL2008, SQLCMD (хотя я получаю такое же поведение с osql.exe) или как-то связана с powershell.
Фактический sql, который выполняет sqlcmd, кажется, не связан с проблемой, так как сценарий sql некоторое время будет работать нормально, а затем завершится ошибкой.
Одна и та же ошибка наблюдалась на разных рабочих станциях и серверах (Win7, Win2003 и Win2008)
Любое руководство о том, как отследить это, будет высоко ценится.
2 ответа
Не использовать sqlcmd
и командные строки, если вы используете Powershell!
В V2 есть очень хорошие встроенные инструменты, которые обеспечивают более надежное взаимодействие с SQL Server и не требуют разбора текста кодов возврата для проверки на наличие ошибок - они фактически возвращают правильные коды ошибок.
Вот техническая статья на Invoke-SQLCmd
Имейте в виду, что вам нужно сначала загрузить оснастки:
Add-PSSnapin SqlServerProviderSnapin100
Add-PSSnapin SqlServerCmdletSnapin100
Коренная причина на самом деле объясняется в другом месте здесь
Код выхода -1073741502
является 0xC0000142
в шестнадцатеричном виде (status_dll_init_failed).
Microsoft KB2701373 обращается к утечкам, сделанным Console.Write
в Microsoft.powershell.consolehost.dll
,
Примечание: некоторые "исправления" в Интернете предполагают, что нужно сделать что-то по-другому, а затем перезапустить PowerShell. Тем не менее, фактический перезапуск PowerShell - это то, что решает проблему (временно)