Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-即使出现错误,仍继续运行所有SQL语句_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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

SQL-即使出现错误,仍继续运行所有SQL语句,sql,sql-server,sql-server-2008,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 CO

我有一些这样的疑问

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);
可能的错误 现在在4语句中,可能会弹出一条消息,因为表2中没有名为R1的字段

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

我的方法 我试图单独执行这些语句,以接收每行的错误消息,但这花费了太多时间,因为它与通过internet连接到PC的服务器进行了7次连接。所以,我使用了所有这些查询来获取一个连接中的记录,但它在第4行中断了命令,因为语句无效


欢迎任何建议或代码使用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);

您应该在指令之间使用“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
这会给你所有的信息,并会一个接一个地执行所有的句子。这些是我在类似情况下的日志。正如您将看到的,会通知各种错误,而不仅仅是一个:

注意:捕获行为取决于错误的严重程度,这 MSDOC的链接解释了try_catch的工作原理


希望有帮助:)

如果Table2没有列R1,那么语句“alterTable2 alterColumnR1 varchar(MAX);”将不是有效的sql语句,因此该语句将不会尝试运行,因此不会发生捕获。相反,如果您执行该语句,它将尝试运行,捕获将起作用

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);

我注意到,如果这些命令是在一个打开的会话中运行的,那么我们可以获得所需的行为

mysql-u root-p myDB
>>在出现第一个错误时停止

mysql -u root -p myDB
(after login)
source commands.sql

^^^即使在出现错误后仍将继续

尝试此操作,但不起作用。错误消息保留在那里,而不打印消息“错误更改表2的R1列”@FelixPamittan我尝试创建一个没有表的新数据库,并使用了一个try-catch,但它不会打印错误消息,而是打印系统默认值message@DeveloperNation未捕获错误,因为错误的严重性必须低于catch块应处理的严重性。也指Sabbegh Houssem在其answernice技巧中提到的。非常适合我的情况(很多表更改。对于我来说,try-catch没有任何意义。我只需要一种“请继续执行,不管有什么错误”,这是完美的