PowerShell:如何放置;“写入主机”;“之前的内部SQL代码”;“回滚事务”;

PowerShell:如何放置;“写入主机”;“之前的内部SQL代码”;“回滚事务”;,sql,powershell,Sql,Powershell,在下面的powershell脚本中,我正在执行多个SQL语句。所有SQL语句都在事务中。现在,如果出现任何错误,执行将落在BEGIN CATCH下,所有事务都将回滚 现在,我想在回滚事务之前或之后使用“Write Host”添加一条消息 [CmdletBinding()] Param( [string]$SQLServer='(local)' ) # Database Update Write-Host "Update Database" -ForegroundColor Green &

在下面的powershell脚本中,我正在执行多个SQL语句。所有SQL语句都在事务中。现在,如果出现任何错误,执行将落在BEGIN CATCH下,所有事务都将回滚

现在,我想在
回滚事务之前或之后使用“Write Host”添加一条消息

[CmdletBinding()]
Param(
[string]$SQLServer='(local)'
)
# Database Update
Write-Host "Update Database" -ForegroundColor Green
& sqlcmd.exe -S $SQLServer -Q @"
USE [Test]
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO DBO.A1 (Name) VALUES ('test1')
INSERT INTO DBO.A2 (Name) VALUES ('test1')
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() as ErrorMessage;

ROLLBACK TRANSACTION

END CATCH
"@
这可能吗?

我试过这样做

@"
USE [Test]
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO DBO.A1 (Name) VALUES ('test1')
INSERT INTO DBO.A2 (Name) VALUES ('test1')
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() as ErrorMessage;

ROLLBACK TRANSACTION
$(Write-Host 'blah')

END CATCH
"@
开始捕捉
选择ERROR_MESSAGE()作为ErrorMessage;
回滚事务
$($Result=1)
端接
"@
如果($Result=1)
{
写入主机“更新数据库失败”-ForegroundColor绿色

}
查询文本作为一个整体作为要编译和执行的文本块传递给SQL Server。此时,SQL Server不知道连接是作为powershell脚本的一部分启动的。如果使用
SqlServer
模块和
Invoke Sqlcmd
,您只需捕获语句产生的错误即可不必依赖于
sqlcmd
的输出(
TRY..CATCH
如果使用
SET-XACT\u-ABORT-on
,则不必使用
CATCH
,但如果要保留它,请在
CATCH
中使用
THROW
)有任何示例代码吗?谢谢,
blah
出现在顶部,而不是在
SELECT ERROR_MESSAGE()之后作为ErrorMessage;
问题,我能在
回滚事务之后立即返回变量吗?哎哟,我的坏,对不起。我只是偶尔玩这种东西。顺便说一句,sqlcmd.exe可能是最好的选择,也可能不是。System.Data.SqlClient如何?一切都很好。但可能我可以返回一个用于TRY/CATCH的变量并使用此变量B后来的剧本