2011-09-14 12 views
0

私はこのエラーになっています:どのようにBEGIN文とCOMMIT文が一致しないのかを修正しますか?

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 2, current count = 3.

をしかし、私はエラーを停止するために、SQL Serverについて十分に知りません。ここで

は私 DROP PROCEDUREコマンドです:

--Specify database in which to uninstall procedure 
USE SalesLogix_Dev 
GO 

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'usp_matt_db_tasks') 
      AND OBJECTPROPERTY(id, N'IsProcedure') = 1) 
DROP PROCEDURE usp_matt_db_tasks 
GO 

そしてここCREATE PROCEDUREです:

--Specify database in which to install procedure 
USE SalesLogix_Dev 
GO 

--Drop existing objects in order to guanrantee error-free install 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'usp_matt_db_tasks') 
      AND OBJECTPROPERTY(id, N'IsProcedure') = 1) 
DROP PROCEDURE usp_matt_db_tasks 
GO 


CREATE PROCEDURE usp_matt_db_tasks 
    -- Add the parameters for the stored procedure here 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    BEGIN TRANSACTION 
INSERT INTO [SalesLogix_Dev].[sysdba].[LEAD] (
    CREATEUSER, 
    CREATEDATE, 
    MODIFYUSER, 
    MODIFYDATE, 
    FIRSTNAME, 
    ACCOUNTMANAGERID, 
    ASSIGNDATE, 
    COMPANY, 
    COMPANY_UC, 
    EMAIL, 
    DONOTSOLICIT, 
    ISPRIMARY, 
    LEADSOURCEID, 
    SECCODEID, 
    STATUS, 
    LASTNAME, 
    LASTNAME_UC, 
    INDUSTRY, 
    NOTES, 
    HOMEPHONE) 
SELECT 
     ,'something' 
     ,CURRENT_TIMESTAMP 
     ,'something'  
     ,CURRENT_TIMESTAMP 
     ,replace(firstname, '"', '') 
     ,'something' 
     ,CURRENT_TIMESTAMP 
     ,replace(company, '"', '') 
     ,replace(UPPER(company), '"', '') 
     ,replace(email, '"', '') 
     ,'1' 
     ,'T' 
     ,'' 
     ,'SYST00000001' 
     ,'New' 
     ,replace(lastname, '"', '') 
     ,replace(UPPER(lastname), '"', '') 
     ,replace(department, '"', '') 
     ,replace(comments, '"', '') 
     ,replace(phone, '"', '') 

    FROM [SalesLogix_Dev].[sysdba].[CSVTemp] 

update [SalesLogix_Dev].[sysdba].[LEAD] set LEAD_ADDRESSID = 'Q' + LEADID where DONOTSOLICIT = 1 

INSERT INTO [SalesLogix_Dev].[sysdba].[LEAD_ADDRESS] (
    LEAD_ADDRESSID, 
    LEADID, 
    CREATEUSER, 
    CREATEDATE, 
    MODIFYUSER, 
    MODIFYDATE, 
    ISMAILING, 
    ISPRIMARY) 
SELECT 
     LEAD_ADDRESSID 
    ,LEADID 
    ,'something' 
    ,CURRENT_TIMESTAMP 
    ,'something'  
    ,CURRENT_TIMESTAMP 
    ,'T' 
    ,'T' 

    FROM [SalesLogix_Dev].[sysdba].[LEAD] where DONOTSOLICIT = 1 

    update [SalesLogix_Dev].[sysdba].[LEAD] set DONOTSOLICIT = 0 where DONOTSOLICIT = 1 
    DROP TABLE [SalesLogix_Dev].[sysdba].[CSVTemp] 
    ROLLBACK TRANSACTION 
COMMIT TRANSACTION 

END 

そして最後に、私は次のように実行します。あなたはローリングしているよう

USE SalesLogix_Dev 
GO 

EXEC usp_matt_db_tasks; 
+2

なぜ 'ROLLBACK'の直後に' COMMIT'がありますか?コミットするかロールバックしようとしていますか?私はまた、このプロシージャが 'BEGIN TRANSACTION'のより多くのインスタンスを持っていることを推測します(または、それ自身のトランザクションコンテキストを持つ別のプロシージャによって呼び出されます)。私は、重要な情報が欠落している短い質問に完全な質問をしたいと思う。私たちに手続き全体を教えてもらえますか? –

+0

問題を修正すると思ってロールバックを追加しました – Trace

+0

このプロシージャのすべてのインスタンスを削除する手段があります – Trace

答えて

2

CREATE PROCEDURE dbo.usp_matt_db_tasks 
AS 
BEGIN 
    SET NOCOUNT ON; 

    BEGIN TRANSACTION; 

    INSERT INTO [SalesLogix_Dev].[sysdba].[LEAD] 
    (
     CREATEUSER, 
     ... 
     HOMEPHONE 
    ) 
    SELECT 
      ,'something' 
      ... 
      ,replace(phone, '"', '') 
    FROM [SalesLogix_Dev].[sysdba].[CSVTemp]; 

    UPDATE [SalesLogix_Dev].[sysdba].[LEAD] 
     SET LEAD_ADDRESSID = 'Q' + LEADID 
     WHERE DONOTSOLICIT = 1; 

    INSERT INTO [SalesLogix_Dev].[sysdba].[LEAD_ADDRESS] 
    (
     LEAD_ADDRESSID, 
       ... 
     ISPRIMARY 
    ) 
    SELECT 
     LEAD_ADDRESSID 
       ,... 
     ,'T' 
    FROM [SalesLogix_Dev].[sysdba].[LEAD] 
    WHERE DONOTSOLICIT = 1; 

    UPDATE [SalesLogix_Dev].[sysdba].[LEAD] 
     SET DONOTSOLICIT = 0 
     WHERE DONOTSOLICIT = 1; 

    DROP TABLE [SalesLogix_Dev].[sysdba].[CSVTemp]; 

    COMMIT TRANSACTION; 
END 
GO 

このプロシージャを呼び出すときに今、あなたは常にEXEC dbo.usp_matt_db_tasks;を使用する必要がありますし、あなたが適切に何かがうまくいかない場合には、トランザクションをロールバックできるように、あなたはおそらく、いくつかのエラー処理を追加することを検討すべきです。

2

が見えますトランザクションを戻し、コミットしようとします。

"begin transaction"を終了する必要があります。あなたは、新しいクエリウィンドウでプロシージャを作成し、あなたの現在のウィンドウを閉じて、現在アクティブなすべてのトランザクションをロールバックする必要があり

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += 'DROP PROCEDURE ' 
    + SCHEMA_ID(name) + '.' 
    + QUOTENAME(name) + ';' 
    FROM sys.procedures WHERE name = 'usp_matt_db_tasks'; 

EXEC sp_executesql @sql; 

:名前usp_matt_db_tasksこのクエリを実行することができて、すべての手続きをドロップする

+0

どういう意味ですか...私はちょうどロールバックを追加しました。ロールバックの前にこのようなエラーが発生しました – Trace

関連する問題