【发布时间】:2018-06-04 09:11:18
【问题描述】:
在下面的 power-shell 脚本中,我正在执行多个 SQL 语句。所有 SQL 语句都在 TRANSACTION 中。现在万一出现任何错误,执行属于 BEGIN CATCH 并且我的所有事务都是 ROLLBACK。
现在我想在ROLLBACK TRANSACTION 之前或之后使用“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
"@
这可能吗?
【问题讨论】:
-
查询文本作为一个整体传递给 SQL Server 作为要编译和执行的文本块。 SQL Server 那时不知道连接是作为 powershell 脚本的一部分启动的。
-
如果您使用
SqlServer模块和Invoke-Sqlcmd,您可以简单地捕获语句产生的错误,而不必依赖sqlcmd的输出。 (如果您使用SET XACT_ABORT ON,TRY .. CATCH应该变得不必要,但如果您想保留它,请在CATCH中使用THROW。) -
请提供示例代码?
标签: sql powershell