2014-02-09 12 views
-1

我正在与SQlite合作,我有很多T-SQL,我希望以这种方式执行它们:如何在T-SQL之前抛出错误时执行下一个T-SQL?

T-SQL1; T-SQL2,... T-SQLN

我的T-SQL是:

insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,1); 
insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,2); 
insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,3); 
... 

有了这个T.SQLs我想从与表2的table1的相关记录。如果存在任何关系,则所有T-SQL都执行没有问题,但如果对于第二个关系存在问题,则第一个是执行,但第三个和下一个T-SQL不执行。

我的quiestion是,如果有什么方法可以继续执行T-SQL,并且不关心如果某些T-SQL抛出错误,因为我想让它有关系,如果存在某种关系这是因为其他用户创建了它,所以最终我想要的是关系存在,所以我想继续使用下一个T-SQL。

可能吗?

但是,如果我尝试删除不存在的记录,则会执行下一个T-SQL,因此SQLite不关心该错误并继续执行以下操作。为什么当我尝试添加新记录时,它不能以同样的方式工作?

谢谢。

回答

1

我强烈建议检查是否可以执行T-SQL,而不是忽略错误。

DECLARE @count int 

SET @count = (SELECT COUNT(1) FROM myRelationTable WHERE IDTable1 =1 AND IDTabl2 = 1) 
IF @count = 0 OR @count IS NULL 
BEGIN 
    INSERT INTO myRelationTable(IDTable1, IDTabl2) VALUES (1,1) 
END 


SET @count = (SELECT COUNT(1) FROM myRelationTable WHERE IDTable1 =1 AND IDTabl2 = 2) 
IF @count = 0 OR @count IS NULL 
BEGIN 
    INSERT INTO myRelationTable(IDTable1, IDTabl2) VALUES (1,2) 
END 


SET @count = (SELECT COUNT(1) FROM myRelationTable WHERE IDTable1 =1 AND IDTabl2 = 3) 
IF @count = 0 OR @count IS NULL 
BEGIN 
    INSERT INTO myRelationTable(IDTable1, IDTabl2) VALUES (1,3) 
END 

从而可以很容易地在存储过程中包裹:

你可以做到这一点。

至于你的问题的答案是:
当然,很容易:

BEGIN TRY 
    insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,1); 
END TRY 
BEGIN CATCH 
    --Do nothing 
END CATCH 

BEGIN TRY 
    insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,2); 
END TRY 
BEGIN CATCH 
    --Do nothing  
END CATCH 

BEGIN TRY 
    insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,3); 
END TRY 
BEGIN CATCH 
    --Do nothing  
END CATCH 
0

真的是我的问题是,我使用SQLite的专家来执行T-SQL,但是这个程序检测为错误语法开始尝试线。

解决问题另一种方法是使用igonre关键字这样:

insert or ignore into my table... 

这使得,如果存在错误,则忽略它并执行下一条语句。但是,再次,SQLite专家会将“忽略”关键字检测为语法错误。

“ignore”关键字属于on冲突clouse。有更多的信息在这link

谢谢。