2009-09-26 3 views
25
CREATE PROCEDURE [dbo].[PL_GEN_PROVN_NO1]   
@GAD_COMP_CODE VARCHAR(2) =NULL, 
@@voucher_no numeric =null output 
AS   
BEGIN 
    DECLARE @NUM NUMERIC 
    DECLARE @PNO NUMERIC        
    SET @PNO = 0 
    DECLARE @PNO1 NUMERIC 
    SET @PNO1=0 

-- begin transaction 

    IF NOT EXISTS (select GLDC_NEXT_PRV_NO 
       FROM GLAS_FINANCIAL_DOCUMENTS   
        WHERE GLDC_COMP_CODE = @GAD_COMP_CODE   
        AND GLDC_DOC_CODE = 'JV') 
    BEGIN 
       RAISERROR ('Error in generating provision number..',16,1) 
       -- ROLLBACK TRANSACTION 
    END 
ELSE 
SELECT @PNO=ISNULL(GLDC_NEXT_PRV_NO,0)+1 
FROM GLAS_FINANCIAL_DOCUMENTS   
WHERE GLDC_COMP_CODE = @GAD_COMP_CODE   
AND GLDC_DOC_CODE = 'JV' 

UPDATE GLAS_FINANCIAL_DOCUMENTS   
SET GLDC_NEXT_PRV_NO = @PNO   
WHERE GLDC_COMP_CODE = @GAD_COMP_CODE   
AND GLDC_DOC_CODE = 'JV' 

set @@[email protected]  
--commit transaction 
END 

이 proc에서 예외 캐치를 처리하는 방법은 무엇입니까?SQL 저장 프로 시저에 시도/캐치를 추가하는 방법

+0

그 슬픈하지만 난 일이에이이 - 사람들이 대문자로 SQL 작성에 대한 주장 :로! –

답변

29

here

CREATE PROCEDURE [dbo].[PL_GEN_PROVN_NO1]   
     @GAD_COMP_CODE VARCHAR(2) =NULL, 
     @@voucher_no numeric =null output 
     AS   
    BEGIN 

    begin try 
     -- your proc code 
    end try 

    begin catch 
      -- what you want to do in catch 
    end catch  
    END -- proc end 
27

거래-SQL은 약간 더 까다 C# 또는 C 때문에 거래의 복잡성의/catch 블록을 시도 ++ 것입니다 참조하십시오. CATCH 블록은 xact_state() 함수를 확인하고 커밋 할 수 있는지 아니면 롤백해야하는지 결정해야합니다. 내 블로그의 주제를 포함하고 난 제대로 가능 중첩 된 트랜잭션을 포함, 시도 캐치 블록에 트랜잭션을 처리하는 방법을 보여줍니다 기사가 있습니다 Exception handling and nested transactions.

create procedure [usp_my_procedure_name] 
as 
begin 
    set nocount on; 
    declare @trancount int; 
    set @trancount = @@trancount; 
    begin try 
     if @trancount = 0 
      begin transaction 
     else 
      save transaction usp_my_procedure_name; 

     -- Do the actual work here 

lbexit: 
     if @trancount = 0 
      commit; 
    end try 
    begin catch 
     declare @error int, @message varchar(4000), @xstate int; 
     select @error = ERROR_NUMBER(), 
       @message = ERROR_MESSAGE(), @xstate = XACT_STATE(); 
     if @xstate = -1 
      rollback; 
     if @xstate = 1 and @trancount = 0 
      rollback 
     if @xstate = 1 and @trancount > 0 
      rollback transaction usp_my_procedure_name; 

     raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ; 
     return; 
    end catch 
end 
2

네를 - 할 수 있습니다 심지어 중첩의 try catch 문을

BEGIN TRY 
SET @myFixDte = CONVERT(datetime, @myFixDteStr,101) 
END TRY 
BEGIN CATCH 
    BEGIN TRY 
     SET @myFixDte = CONVERT(datetime, @myFixDteStr,103) 
END TRY 
BEGIN CATCH 
    BEGIN TRY 
     SET @myFixDte = CONVERT(datetime, @myFixDteStr,104) 
    END TRY 
    BEGIN CATCH 
     SET @myFixDte = CONVERT(datetime, @myFixDteStr,105) 
    END CATCH 
END CATCH END CATCH 
0
Create Proc[usp_mquestions] 
( 
@title nvarchar(500), --0 
@tags nvarchar(max), --1 
@category nvarchar(200), --2 
@ispoll char(1), --3 
@descriptions nvarchar(max), --4 
)    
AS 
BEGIN TRY 




BEGIN 
DECLARE @message varchar(1000); 
DECLARE @tempid bigint; 

IF((SELECT count(id) from [xyz] WHERE [email protected])>0) 
BEGIN 
SELECT 'record already existed.'; 
END 
ELSE 
BEGIN    


if @id=0 
begin 
select @tempid =id from [xyz] where [email protected]; 

if @tempid is null 
BEGIN 
     INSERT INTO xyz 
     (entrydate,updatedate) 
     VALUES 
     (GETDATE(),GETDATE()) 

     SET @[email protected]@IDENTITY; 
END 
END 
ELSE 
BEGIN 
set @[email protected] 
END 
if @tempid>0 
BEGIN 

    -- Updation of table begin-- 


UPDATE tab_questions 
set [email protected], --0 
[email protected], --1 
[email protected], --2 
[email protected], --3 
[email protected], --4 
[email protected], --5 

WHERE [email protected] ; --9 ; 


IF @id=0 
BEGIN 
SET @message= 'success:Record added successfully:'+ convert(varchar(10), @tempid) 
END 
ELSE 
BEGIN 
SET @message= 'success:Record updated successfully.:'+ convert(varchar(10), @tempid) 

END 
END 
ELSE 
BEGIN 
SET @message= 'failed:invalid request:'+convert(varchar(10), @tempid) 
END 

END 
END 

END TRY 
BEGIN CATCH 
    SET @message='failed:'+ ERROR_MESSAGE(); 
END CATCH 
SELECT @message; 
+0

해답을 설명하는 것이 도움이 될 것입니다. –