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
希望能帮助到你 :)
使用 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)