Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
732 views
in Technique[技术] by (71.8m points)

sql - Error detection from Powershell Invoke-Sqlcmd not always working?

The database is updated by executing a list of queries that are located in a folder.

I need to be able to detect any errors that would also result in "Query completed with errors" in SQL Server Management Studio.

The following works to detect the "Invalid Object" error:

PS SQLSERVER:> $ErrorActionPreference
Stop
PS SQLSERVER:> $Error.Clear()
PS SQLSERVER:> $Error
PS SQLSERVER:> Invoke-Sqlcmd -ServerInstance .SQLEXPRESS -Database Test -Query "select * from doesnotexist" -ErrorAction SilentlyContinue
PS SQLSERVER:> $Error.Exception
Invalid object name 'doesnotexist'.
PS SQLSERVER:>

Doing the same for select 1/0 does not work:

PS SQLSERVER:> $ErrorActionPreference
Stop
PS SQLSERVER:> $Error.Clear()
PS SQLSERVER:> $Error
PS SQLSERVER:> Invoke-Sqlcmd -ServerInstance .SQLEXPRESS -Database Test -Query "select 1/0" -ErrorAction SilentlyContinue
PS SQLSERVER:> $Error.Exception
PS SQLSERVER:>

I would expect this to result in a "Divide by zero error encountered" error just like in SSMS.

Not detecting this particular error makes me wonder if other errors will also remain undetected.

Any idea why this is a happening and how I can make sure the all errors will be detected?

UPDATE

It turns out that I do not have Invoke-Sqlcmd available on the server I am installing, so on second thought I have to use sqlcmd.exe.

I think this is working for me:

$tempfile = [io.path]::GetTempFileName()
$cmd = [string]::Format("sqlcmd -S {0} -U {1} -P {2} -d {3} -i {4} -b > $tempfile",
    $g_connectionstring."Data Source",
    $g_connectionstring."User ID",
    $g_connectionstring."Password",
    $g_connectionstring."Initial Catalog",
    $path)
Invoke-Expression -Command $cmd
if ($LASTEXITCODE)
{
    $err = Get-Content $tempfile | Out-String
    Corax-Message "SQL" "Error" $err
    exit
}
Remove-Item $tempfile
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Regardless of the ErrorAction setting, invoke-sqlcmd cmdlet has a bug present in SQL Server 2008, 2008 R2 and 2012 versions of the cmdlet where T-SQL errors like divide by 0 do not cause an error. I logged a connect item on this and you can see details here:

https://connect.microsoft.com/SQLServer/feedback/details/779320/invoke-sqlcmd-does-not-return-t-sql-errors

Note: the issue is fixed in SQL 2014, however it does not appear a fix has been or will be provided for previous versions.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...