2011-08-18 40 views
0

下面是我的存储过程的代码,但我并不完全清楚执行的流程。我的例子中的@@ RAISERROR()如何工作以及它如何改变正常流程?这个函数中的数字又是什么意思?有几个其他数字也可以用来代替10 & 1,所以这些数字如何影响执行流程。请让我知道,如果我的风格的编码结构是坏/错或者是否有任何改进的余地。 以下是我的代码。以下过程的执行流程是什么?

CREATE PROCEDURE spAddressMaster 
@Mode   varchar(20), 
@Street   varchar(MAX), 
@City   varchar(300), 
@State   varchar(300), 
@Country  varchar(300), 
@PostalCode  int, 
@Remarks  varchar(MAX), 
@Type   varchar(300) 
AS 
BEGIN 
BEGIN TRANSACTION 
BEGIN TRY 
--INSERT MODE-- 
IF(@Mode='INSERT') 
BEGIN 
    INSERT INTO [AddressMST] (
       [Street], 
       [City], 
       [State], 
       [Country], 
       [PostalCode], 
       [Remarks], 
       [Type] 
       ) 
    VALUES (
     @Street, 
     @City, 
     @State, 
     @Country, 
     @PostalCode, 
     @Remarks, 
     @Type 
    ) 
IF(@@ERROR<>0) 
    RAISERROR('Insert Operation Fail',10,1) 
END 
END TRY 
BEGIN CATCH 
    IF(@@ERROR<>0) 
    BEGIN 
     ROLLBACK TRANSACTION 
     SELECT ERROR_MESSAGE() 
    END 
END CATCH 
END 
GO 
+0

你可以很容易地用几个PRINT语句测试自己... –

+0

@Mitch小麦我需要更好地解释@@ RAISEERROR()函数,我认为我可以用PRINT获得... –

回答

1

首先,你有一个很大的问题:你有没有BEGIN TRANSACTION任何COMMIT。这在编写数据库时会遇到错误!使用此一般结构:

BEGIN TRANSACTION 

BEGIN TRY 

…do stuff… 

COMMIT 
END TRY 

BEGIN CATCH 

…error handling… 

ROLLBACK 

END CATCH 

接下来,当您在BEGIN TRY块内执行代码,如果任何错误提出执行是立即 transferrred到BEGIN CATCH块。这意味着IF(@@ERROR<>0)块只会在没有错误发生时执行,即@@ ERROR将始终为0.

至于RAISERROR中的10和1的含义,这是复杂的,详细的在“RAISERROR”条目下,最好在SQL Server图书在线进行解释。这是Link

0

MSDN文档

Generates an error message and initiates error processing for the session. 
RAISERROR can either reference a user-defined message stored in the sys.messages catalog 
view or build a message dynamically. The message is returned as a server error message 
to the calling application or to an associated CATCH block of a TRY…CATCH construct. 

欲了解更多请参考link