SQL - 即使发生错误也继续运行所有 SQL 语句

Dev*_*ion 8 sql sql-server sql-server-2008

我有一些这样的查询

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);
Run Code Online (Sandbox Code Playgroud)

可能的错误

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

需要

我需要一种方法,以便即使在收到错误后也能执行所有语句。

我的方法

我试图单独执行这些语句以接收每一行的错误消息,但它需要太多时间,因为它与通过互联网连接到 PC服务器建立了 7 次连接。因此,我将所有这些查询一起使用以在一个连接中获取记录,但由于语句无效,它在第 4 行中断了命令。


任何建议或代码片段表示赞赏

小智 8

无论出现错误,您都应该在指令之间使用“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
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

希望能帮助到你 :)


Has*_*Psi 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);
Run Code Online (Sandbox Code Playgroud)