我希望有人能给我一个关于如何处理这种情况的想法。我有一个存储过程可以更新各种表。某些查询需要连接到其他链接的服务器。有时那些链接的服务器已关闭,无论如何,我都需要该程序仍然运行下一条语句。下面是一个示例:
--Stored Procedure
BEGIN
INSERT INTO table1
SELECT *
FROM Z1;
-- IF ABOVE FAILS GO TO NEXT QUERY ANYWAY
INSERT INTO table1
SELECT *
FROM Z2;
-- IF ABOVE FAILS GO TO NEXT QUERY ANYWAY
INSERT INTO table1
SELECT *
FROM Z3;
END
答案 0 :(得分:1)
您可以使用TRY
/ CATCH
块来做您想做的事情:
BEGIN
BEGIN TRY
INSERT INTO table1 SELECT * FROM Z1;
END TRY
BEGIN CATCH
-- you can do something here if you want
END CATCH;
-- IF ABOVE FAILS GO TO NEXT QUERY ANYWAY
BEGIN TRY
INSERT INTO table1 SELECT * FROM Z2;
END TRY
BEGIN CATCH
-- you can do something here if you want
END CATCH;
-- IF ABOVE FAILS GO TO NEXT QUERY ANYWAY
BEGIN TRY
INSERT INTO table1 SELECT * FROM Z3;
END TRY
BEGIN CATCH
-- you can do something here if you want
END CATCH;
END;
这处理运行时错误。如果您有 compile 时间错误-例如表不存在或表之间的列不匹配,那么这将无济于事。
答案 1 :(得分:0)
如果这是从一堆普通查询中说出的ssms运行的,那么我将在它们之间放置批处理分隔符以将其分开处理。但是,由于这是一个存储过程,所以您不能这样做。解决该问题的一种方法是为每个查询创建一个存储过程,并将所有过程作为步骤放入SQL Server代理作业中。您可以运行作业,即使中间的某些步骤失败,每个步骤也会从上到下依次执行。
答案 2 :(得分:0)
这也将起作用:@@ ROWCOUNT与oracle等效于sql%rowcount
--Stored Procedure
BEGIN
INSERT INTO table1
SELECT *
FROM Z1;
IF @@ROWCOUNT <>1
INSERT INTO table1
SELECT *
FROM Z2;
IF @@ROWCOUNT <>1
INSERT INTO table1
SELECT *
FROM Z3;
END