Powershell
使用 Invoke-Sqlcmd 時如何本機返回輸出?
如何從 PowerShell Invoke-Sqlcmd 本地記錄輸出?
我正在使用 Invoke-Sqlcmd 循環遍歷一組大型(50,000-90,000 個 SQL 文件,每個文件中有 1-10 個插入)小 SQL 插入語句集。大多數插入語句執行正確,但一些字元串太長,我得到“字元串或二進制數據將被截斷”錯誤。
現在我正在使用 Start-Transcript 來擷取輸出並辨識有問題的插入語句,但 Start-Transcript 會擷取所有內容。我只想捕捉錯誤 - 或者 - 只捕捉 Invoke_Sqlcmd 語句輸出。
如果這行得通(我相信它應該),我會準備好的:
Invoke-Sqlcmd -InputFile $sql -ServerInstance LocalHost -Database Test_DB -Credential $pwd -Verbose -OutputSqlErrors $true | Out-File -FilePath "C:\Temp\Errorlog.txt" -Append
或者,如果這有效:
Invoke-Sqlcmd -InputFile $sql -ServerInstance LocalHost -Database Test_DB -Credential $pwd -Verbose -OutputSqlErrors $true | Tee-Object -FilePath "C:\Temp\Errorlog.txt" -Append
但這些都不起作用。
我也嘗試過這個怪物,但我根本沒有得到任何錯誤:
$sqls = (Get-ChildItem -Path "I:\2019_06_24\_SQL"-Filter *.sql | Sort-Object -Property CreationTime).FullName foreach ($sql in $sqls) { $Error.Clear() try { Invoke-Sqlcmd -InputFile $sql -ServerInstance LocalHost -Database Test_DB -Credential $pwd -Verbose -OutputSqlErrors $true } catch { 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' | Out-File "C:\Temp\Errorlog.txt" -Append $sql | out-file -filepath "C:\Temp\Errorlog.txt" -Append $Error | out-file -filepath "C:\Temp\Errorlog.txt" -Append } }
如何直接從 Invoke-Sqlcmd 語句記錄?
此程式碼基於您上面的“怪物”範例。
在每個循環開始時,它會清除 $ error variable. Then if the Invoke-Sqlcmd generates an error the IF statement picks it up. It will then add the FullName ( $ sql) 到日誌文件,然後在下一行添加錯誤。
$sqls = (Get-ChildItem -Path "I:\2019_06_24\_SQL" -Filter *.sql | Sort-Object -Property CreationTime).FullName foreach ($sql in $sqls) { $error.clear() Invoke-Sqlcmd -InputFile $sql -ServerInstance LocalHost -Database Test_DB -Credential $pwd -Verbose -OutputSqlErrors $true if ($error -ne $null) { $sql + ' ' + $error | Out-File -FilePath "C:\Temp\ErrorLog.txt" -Append } }
實際上,ErrorLog.txt 看起來類似於以下內容:
I:\2019_06_24\_SQL\Test_File_5.sql String or binary data would be truncated. The statement has been terminated. Msg 8152, Level 16, State 30, Procedure , Line 3. I:\2019_06_24\_SQL\Test_File_303.sql String or binary data would be truncated. The statement has been terminated. Msg 8152, Level 16, State 30, Procedure , Line 3.