Powershell

使用 Invoke-Sqlcmd 時如何本機返回輸出?

  • June 26, 2019

如何從 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.

引用自:https://dba.stackexchange.com/questions/241458