2017-06-02 61 views
0

我一直在编写一个存储过程。但是现在我不确定我是否做得很好。我有这样的代码:带有多个更新的SQL Server(t-sql)存储过程

BEGIN 
    UPDATE tblPro 
    SET Email = @p_Email 
    WHERE ProID = @p_proId 

    UPDATE tblVisits 
    SET VisitBrief = 'CONFIRMED' 
    WHERE VisitID = @p_visitId 

    UPDATE Bookings 
    SET JobConfirmation = 1 
    WHERE BookingID = @p_bookingId 

    IF @@ROWCOUNT > 0 
    BEGIN 
     INSERT INTO tblView (ViewLogType) 
     VALUES ('Visit') 
    END 
    ELSE 
     PRINT 'WARNING: Insert Failed' 
END 

是更好地有@@ROWCOUNT > 0每次更新后声明只是为了确保所有的语句被执行?

感谢意见

+1

这取决于你。您当前使用的@@ rowcount仅计算受上次更新影响的行。 –

+2

如果因为目标行不存在而导致上一次更新失败时需要插入一行,那么您会这样做,只有您知道这是否可行。这被称为* upsert *,在T-SQL中做这件事的方法是使用'MERGE'。 –

+0

如果您担心存储过程的正确性,那么我会首先将set nocount添加为第一个语句之一。 – GuidoG

回答

1

如果你想发现错误,你可以使用try/catch语句。

如果您想保存行数以备后续使用,则应记录它们以查找您有兴趣保存的语句。即使语句正确执行(行受影响),Rowcount仍然可以为零。

如果您希望能够在其中一个语句失败时进行回滚,那么也可以使用事务。

+0

谢谢。如果我使用TRY/CATCH并从C#应用程序调用存储过程,如果发生错误,C#中的catch(Exception ex)会捕获错误吗? – KMR

+0

您可以在SP中使用RETURN语句。 – SAS

+0

我需要使用RETURN语句返回ERROR。请给我看一个例子吗?非常感谢 – KMR