2009-09-26 18 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 

इस प्रक्रिया में मैं अपवाद के लिए प्रयास को कैसे संभाला जा सकता हूं?एसक्यूएल संग्रहीत प्रक्रिया

+0

इसका दुख की बात है, लेकिन मैं काम दो पर यह है - लोगों को बड़े अक्षर में एसक्यूएल लेखन पर जोर देते हैं! –

उत्तर

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

Transact-SQL में थोड़ा और अधिक मुश्किल है कि सी # या सी लेनदेन का जोड़ा जटिलता की वजह से कोशिश ++/पकड़ ब्लॉक, है। एक कैच ब्लॉक को 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

हां - तुम भी घोंसला कोशिश पकड़ बयान कर सकते हैं के रूप में:

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

उत्तर के साथ एक स्पष्टीकरण अच्छा होगा। –

संबंधित मुद्दे