2017-01-13 7 views
0

SQLプログラミング(2012バージョン)クラスを使用していて、何度も何度もプログラムが動作しなくなることがあります。要件(質問)だけでなく、私がこれまでに持っているものは以下の通りです。破線の下には、エラー処理のために書いたもう一つのprocがあります。私はこれを完了するのを助けてください...してください!SQLトランザクション/ ErrorHandling/TryandCatch

/* StockName、NewOpenPrice、NewClosePriceを受け入れるストアドプロシージャを作成します。

a。在庫名が存在しない場合は、新しいレコードをdbo.Stocksテーブルに追加する必要があります。

b。在庫名が存在する場合、OpenPriceとClosePriceは新しく挿入された価格で更新されます。

c。挿入および更新ステートメントは、トランザクション(反復可能な読み取り分離レベル)を使用して構築する必要があります。

d。 Try Catchステートメントは、UpdateステートメントとInsertステートメントに使用する必要があります。エラーが発生した場合は、dbo.error_handlerストアドプロシージャを呼び出す必要があります。 */

CREATE PROCEDURE spc_Stocks 

@Name varchar(25), @NewOpenPrice money, @NewClosePrice money 

as 
BEGIN 
     CREATE TABLE dbo.Stocks (
     StockID int IDENTITY(1,1), 
     StockName varchar(50), 
     OpenPrice money, 
     ClosePrice money ) 

     INSERT INTO dbo.Stocks 
     SELECT 'Walmart',21.58,22.98 UNION 
     SELECT 'Target',17.32,15.23 UNION 
     SELECT 'Taco Bell',4.58,12.98 UNION 
     SELECT 'Microsoft',7.15,8.15 UNION 
     SELECT 'Apple',10.79,9.89 

     Select StockName from stocks 
     where StockName = @Name 
------Name does NOT exist 
    if (@Name = NULL) 
Begin 
     Insert into dbo.Stocks (StockName) 
     Values (@Name) 
END 
----If name DOES exist 
ELSE 
    BEGIN 
     Begin TRY 
      Begin SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 
      UPDATE dbo.Stocks SET OpenPrice [email protected], ClosePrice= @NewClosePrice where StockName = @Name 
    Commit transaction 
    END TRY 
    BEGIN CATCH 

?!?!?!?!?!?


*これは私のErrorHandlerストアドプロシージャのクエリ

ALTER PROCEDURE dbo.error_handler 

as 

BEGIN 

DECLARE @errnum INT, 
     @severity INT, 
     @errstate INT, 
     @proc NVARCHAR(126), 
     @line INT, 
     @message NVARCHAR(4000) 
-- capture the error information that caused the CATCH block to be invoked 
SELECT @errnum = ERROR_NUMBER(), 
     @severity = ERROR_SEVERITY(), 
     @errstate = ERROR_STATE(), 
     @proc = ERROR_PROCEDURE(), 
     @line = ERROR_LINE(), 
     @message = ERROR_MESSAGE() 
    end 

答えて

0
Create PROCEDURE [dbo].[USP_Stocks] 
     (@Name varchar(25), @OpenPrice MONEY, @ClosePrice MONEY) 
AS 
BEGIN 

    -----Name does NOT exist 
    IF NOT EXISTS (SELECT StockName FROM [dbo].[Stocks] 
        WHERE StockName = @Name) 

    BEGIN 

     BEGIN TRY 
      SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 
      BEGIN TRAN 
       INSERT INTO dbo.Stocks (StockName, OpenPrice, ClosePrice) 
       VALUES (@Name ,@OpenPrice, @ClosePrice) 
      COMMIT TRANSACTION 
     END TRY 

     BEGIN CATCH 
      EXEC dbo.error_handler 
      ROLLBACK 
     END CATCH 

    END 

    ----If name DOES exist 
    ELSE 
    BEGIN 
     BEGIN TRY 
      SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 
       BEGIN TRAN 

       UPDATE dbo.Stocks SET OpenPrice [email protected], ClosePrice= @ClosePrice 
       where StockName = @Name 
      Commit transaction 
     END TRY 
     BEGIN CATCH 
      ROLLBACK TRUANSACTION  
      EXEC dbo.error_handler 

     END CATCH 
    END 
END