我创建桌面应用程序。与用户一起选择.sql文件,然后使用Transaction / Rollback运行它。
在这种情况下,我从sql文件读取了所有上下文。并放在以下代码之间,以***** $ Replace $ *****文本替换sql文件脚本。
如果sql文件包含“ GO”批处理,我该如何处理事务/回滚。它的抛出错误。
任何将Handel这种方案类型的解决方案转换为任何sql文件的方法,都可以转换为Transaction / Rollback。
注意:sql文件脚本中没有更改。
sql文件脚本:
INSERT INTO [dbo].[User] ([Name] ,[ContectNo]) VALUES ('m3','33')
GO BEGIN TRANSACTION
INSERT INTO [dbo].[User] ([Name] ,[ContectNo]) VALUES ('m3',null)
GO BEGIN TRANSACTION
INSERT INTO [dbo].[User] ([Name] ,[ContectNo]) VALUES ('m3','99')
GO
-----------------------------------------------------
Transaction block: replace sql file query from *****$Replace$*****
-----------------------------------------------------
SET XACT_ABORT ON;
GO
BEGIN TRY
BEGIN TRANSACTION
*****$Replace$*****
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@ERROR > 0
BEGIN
ROLLBACK TRANSACTION
DECLARE @ErrorMessage NVARCHAR(max) = ERROR_MESSAGE()
DECLARE @ErrorSeverity INT = ERROR_SEVERITY()
DECLARE @ErrorState INT = ERROR_STATE()
DECLARE @ErrorLine INT = ERROR_LINE()
RAISERROR (@ErrorMessage,
@ErrorSeverity,
@ErrorState
);
END
END CATCH
SET XACT_ABORT OFF
答案 0 :(得分:0)
您遇到错误,因为GO
不是应该发送到SQL Server引擎的命令。它是SSMS,sqlcmd和osql之类的工具认可的东西。它表示T-SQL语句批处理的结束,并表示到目前为止的命令(当前批处理)应发送到SQL Server引擎。
您不应尝试将GO
语句作为T-SQL执行。您应该尝试解析文件GO
行,将其拆分为单独的批处理并一一执行,或者确保在这些文件中传递有效的T-SQL内容。
您可以在SQL Server Utilities Statements - GO文章中查看有关GO
语句的更多信息。