【问题标题】:PowerShell: How to place "Write-Host" inside SQL code before "ROLLBACK TRANSACTION"PowerShell:如何在“ROLLBACK TRANSACTION”之前将“Write-Host”放置在 SQL 代码中
【发布时间】: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 ONTRY .. CATCH 应该变得不必要,但如果您想保留它,请在CATCH 中使用THROW。)
  • 请提供示例代码?

标签: sql powershell


【解决方案1】:
@"
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
"@

【讨论】:

  • 谢谢,blah 排在首位,而不是在 SELECT ERROR_MESSAGE() as ErrorMessage; 之后
  • 问题,我可以在ROLLBACK TRANSACTION之后返回一个变量吗?
  • 哎呀,我的错,对不起。我只是偶尔玩这种东西。顺便说一句,sqlcmd.exe 可能是也可能不是最佳选择。 System.Data.SqlClient 怎么样?
  • 一切都很好。但也许我可以为 TRY/CATCH 返回一个变量并稍后在脚本中使用这个变量
【解决方案2】:

我试过这样,

BEGIN CATCH
    SELECT ERROR_MESSAGE() as ErrorMessage;
	
	ROLLBACK TRANSACTION
	
	$($Result =1)
	
END CATCH
"@

if($Result =1)
{
	Write-Host "Update Database FAIL" -ForegroundColor Green
}

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多