SQL - 即使出现错误,继续运行所有的SQL语句

9

我有一些类似这样的查询

Alter Table Table1 ALTER COLUMN T1 varchar(MAX);
Alter Table Table1 ALTER COLUMN T2 varchar(MAX);
Alter Table Table1 ALTER COLUMN T3 varchar(MAX);

--Table2 does not have a column "R1" and is likely to give error
Alter Table Table2 ALTER COLUMN R1 varchar(MAX);

Alter Table Table2 ALTER COLUMN T1 varchar(MAX);
Alter Table Table2 ALTER COLUMN T2 varchar(MAX);
Alter Table Table2 ALTER COLUMN T3 varchar(MAX);

可能出现的错误

现在,在第四条语句中,由于Table2中没有名为R1的字段,很可能会弹出一条消息。

需求

我需要一种方法,使得即使收到错误,所有语句都能够执行。

我的方法

我尝试逐个执行这些语句,以便为每一行接收错误消息,但这需要与连接到PC的Internet服务的服务器建立7次连接,因此耗时过长。因此,我将所有查询一起使用以在一个连接中获取记录,但它会在第4行上中断命令,因为该语句无效。


欢迎提供任何建议或代码片段。

4个回答

11

为了不管出现什么错误都能够继续执行代码,请在指令之间使用“GO”:

Alter Table Table1 ALTER COLUMN T1 varchar(MAX);
GO
Alter Table Table1 ALTER COLUMN T2 varchar(MAX);
GO
Alter Table Table1 ALTER COLUMN T3 varchar(MAX);
GO
Alter Table Table2 ALTER COLUMN R1 varchar(MAX);
GO
Alter Table Table2 ALTER COLUMN T1 varchar(MAX);
GO
Alter Table Table2 ALTER COLUMN T2 varchar(MAX);
GO
Alter Table Table2 ALTER COLUMN T3 varchar(MAX);
GO

这将为您提供所有消息,并依次执行所有句子。这些是我在类似情况下的日志记录。正如您所看到的,会通知各种错误,而不仅仅是一个:

enter image description here

注意:catch行为取决于错误的严重程度,MSDOC中的此链接解释了try_catch的工作原理   https://learn.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-2017

希望有所帮助 :)


1
不错的技巧。非常适合我的情况(有很多表格更改)。对于我来说,使用try catch没有意义。我只需要一种“请继续执行而不管错误”的方式,这很完美。 - Alejandro Teixeira Muñoz

5

使用try-catch块:

Alter Table Table1 ALTER COLUMN T1 varchar(MAX);
Alter Table Table1 ALTER COLUMN T2 varchar(MAX);
Alter Table Table1 ALTER COLUMN T3 varchar(MAX);

BEGIN TRY
     Alter Table Table2 ALTER COLUMN R1 varchar(MAX);
END TRY
BEGIN CATCH
     print 'error altering column R1 of Table2';
END CATCH;

Alter Table Table2 ALTER COLUMN T1 varchar(MAX);
Alter Table Table2 ALTER COLUMN T2 varchar(MAX);
Alter Table Table2 ALTER COLUMN T3 varchar(MAX);

1
尝试过了,但是没有起作用。错误信息仍然存在,没有打印出“修改Table2的R1列时发生错误”的消息。 - Developer Nation
@FelixPamittan 我尝试创建一个没有表的新数据库,并使用了你的try-catch之一,但它没有打印出你的错误消息,而是打印出系统默认消息。 - Developer Nation
@DeveloperNation 错误未被捕获,因为错误的严重程度必须低于catch块应处理的级别。请参考learn.microsoft.com,该网站也被Sabbegh Houssem在他的答案中提到。 - pro_gamer

0
我注意到如果命令是在一个打开的会话中运行,我们可以得到期望的行为。 mysql -u root -p myDB < commands.sql >> 在第一个错误处停止。
mysql -u root -p myDB
(after login)
source commands.sql

即使出现错误,^^^ 仍然继续执行


问题是关于 SQL Server,不是 MySQL。 - Thomas Levesque

0
如果Table2没有列R1,那么语句'Alter Table Table2 ALTER COLUMN R1 varchar(MAX);'将不是一个有效的SQL语句,因此该语句不会尝试运行,所以catch也不会发生。如果你执行该语句,它将尝试运行并且catch将会起作用。
Alter Table Table1 ALTER COLUMN T1 varchar(MAX);
Alter Table Table1 ALTER COLUMN T2 varchar(MAX);
Alter Table Table1 ALTER COLUMN T3 varchar(MAX);

BEGIN TRY
     execute ('Alter Table Table2 ALTER COLUMN R1 varchar(MAX);')
END TRY
BEGIN CATCH
     print 'error altering column R1 of Table2';
END CATCH;

Alter Table Table2 ALTER COLUMN T1 varchar(MAX);
Alter Table Table2 ALTER COLUMN T2 varchar(MAX);
Alter Table Table2 ALTER COLUMN T3 varchar(MAX);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接