2016-12-03 21 views
1

SQL Server Management Studio中發生了一些非常奇怪的事情。執行多個存儲過程導致錯誤[使用事務處理]

我創建了一個存儲過程,然後在每次調用時使用不同的參數執行此存儲過程(在一行中)。

然後我得到一個錯誤,就像我試圖在表中使用相同的主鍵插入一個值,這不應該發生,因爲我有一個條件,試圖避免這一點。

此外,我有存儲過程內的每個代碼塊內的交易。

我有一些問題,SQL Server Management Studio如何觸發所有代碼行?它解析並分別運行每一行?在序列中......我想。我猜想在這種情況下,沒有多個線程同時運行多個存儲過程。

我只是選擇4行以上的存儲過程執行並出現錯誤。

我試圖以單一方式執行每個存儲過程調用,並且我沒有收到任何錯誤。那到底是什麼?我想我的代碼是好的,但也許你應該檢查了這一點:

USE mydatabase; 
GO 

IF EXISTS (SELECT * FROM sys.objects 
      WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('[myschema].[CategoriesFields]')) 
    EXEC('DROP PROCEDURE [myschema].[CategoriesFields]') 

IF NOT EXISTS (SELECT * FROM sys.objects 
       WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('[myschema].[CategoriesFields]')) 
    EXEC('CREATE PROCEDURE [myschema].[CategoriesFields] 
     @CategoryParentName NVARCHAR(256), 
     @CategoryName NVARCHAR(256), 
     @FieldCode NVARCHAR(64) 
     AS 
     BEGIN 
     SET NOCOUNT ON; 
     BEGIN TRY 

     BEGIN TRANSACTION [InsertCategoryTrans]; 

     DECLARE @CategoryId int;        

     DECLARE @CategoryParentId int; 
      IF @CategoryParentName IS NOT NULL 
       SELECT @CategoryParentId = Id FROM [mydatabase].[myschema].[Categories] WHERE CategoryName = @CategoryParentName 

      --INSERT CATEGORY 
      IF @CategoryParentId IS NULL 
       IF NOT EXISTS (SELECT * FROM [mydatabase].[myschema].[Categories] WHERE CategoryName = @CategoryName AND CategoryParentId IS NULL) 
         INSERT INTO [mydatabase].[myschema].[Categories] (CategoryName, CategoryParentId) 
         VALUES (@CategoryName, @CategoryParentId) 
      ELSE     
       IF NOT EXISTS (SELECT * FROM [mydatabase].[myschema].[Categories] WHERE CategoryName = @CategoryName AND CategoryParentId = @CategoryParentId)      
         INSERT INTO [mydatabase].[myschema].[Categories] (CategoryName, CategoryParentId) 
          VALUES (@CategoryName, @CategoryParentId)            

      SET @CategoryId = @@IDENTITY; 

      IF @CategoryId IS NULL 
       SELECT @CategoryId = Id FROM [mydatabase].[myschema].[Categories] WHERE CategoryName = @CategoryName 



      IF @FieldCode IS NOT NULL AND NOT EXISTS (SELECT * FROM [mydatabase].[myschema].[Fields] WHERE CategoryId = @CategoryId AND FieldCode = @FieldCode) 
       INSERT INTO [mydatabase].[myschema].[Fields] (CategoryId, FieldCode) 
        VALUES (@CategoryId, @FieldCode)  

     COMMIT TRANSACTION [InsertCategoryTrans]; 
    END TRY 
    BEGIN CATCH 
     ROLLBACK TRANSACTION [InsertCategoryTrans]; 
     SELECT ERROR_MESSAGE() AS [Message], ERROR_LINE() AS [Line] 
    END CATCH 
    END'); 


EXEC [mydatabase].[myschema].[CategoriesFields] NULL, 'CategoryA', 'FieldExample' 
EXEC [mydatabase].[myschema].[CategoriesFields] NULL, 'CategoryA', 'FieldExample2' 

EXEC [mydatabase].[myschema].[CategoriesFields] 'CategoryA', 'Child_CategoryOfA', 'Arruamento' 


EXEC [mydatabase].[myschema].[CategoriesFields] NULL, 'CategoryB', 'AnotherField' 
EXEC [mydatabase].[myschema].[CategoriesFields] NULL, 'CategoryB', 'AnotherField2' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'CategoryB', 'Child_CategoryOfB', 'AnotherField4' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'CategoryB', 'Child_CategoryOfB', 'AnotherField5' 


EXEC [mydatabase].[myschema].[CategoriesFields] NULL, 'CategoryC', NULL 
EXEC [mydatabase].[myschema].[CategoriesFields] 'CategoryC', 'ChildOfC_Category12', 'Field2' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'CategoryC', 'ChildOfC_Category13', 'Field3' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'CategoryC', 'ChildOfC_Category14', 'Field4' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'CategoryC', 'ChildOfC_Category15', 'Field5' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'CategoryC', 'ChildOfC_Category15', NULL 


EXEC [mydatabase].[myschema].[CategoriesFields] 'ChildOfC_Category15', 'ChildOf_ChildOfC_Category15', 'Detail' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'ChildOfC_Category15', 'ChildOf_ChildOfC_Category15', 'AllowedRoles' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'ChildOfC_Category15', 'ChildOf_ChildOfC_Category15', 'RelatedCompanies' 

EXEC [mydatabase].[myschema].[CategoriesFields] 'FieldLabels', 'Company', 'Identifier' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'FieldLabels', 'Company', 'Name' 

EXEC [mydatabase].[myschema].[CategoriesFields] 'Common', 'FieldLabels', 'Identifier' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'Common', 'FieldLabels', 'Code' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'Common', 'FieldLabels', 'Name' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'Common', 'ButtonLabels', 'Code' 
EXEC [mydatabase].[myschema].[CategoriesFields] 'Common', 'Messages', 'Name' 

當多個選擇所有的線路和執行所有我得到的錯誤是:

INSERT語句衝突以FOREIGN KEY約束 「FK_myschema.Fields_myschema.Categories_CategoryId」。衝突 發生在數據庫「mydatabase」,表「myschema.Categories」,列 'Id'。

預先感謝您!

+0

http://stackoverflow.com/問題/ 2965837/insert-statement-conflict-with-the-foreign-key-constraint –

+0

that does not help,please read the question。我可以逐個運行每個執行。只有在批量我不能...... – TiagoM

+1

您是否嘗試過每個執行命令後使用'GO'命令? – khaled4vokalz

回答

0

好這個問題是固定的改變,我commiting的交易,以及一個事務不同的事務分離的方式,這裏是產生的代碼,如果有人需要

EXEC('CREATE PROCEDURE [myschema].[CategoriesFields] 
     @CategoryParentName NVARCHAR(256), 
     @CategoryName NVARCHAR(256), 
     @FieldCode NVARCHAR(64) 
     AS 
     BEGIN 
     SET NOCOUNT ON; 
     BEGIN TRY 

     BEGIN TRANSACTION [InsertCategoryTrans]; 

     DECLARE @CategoryId int;        

     DECLARE @CategoryParentId int; 
      IF @CategoryParentName IS NOT NULL 
       SELECT @CategoryParentId = Id FROM [mydatabase].[myschema].[Categories] WHERE CategoryName = @CategoryParentName 

      --INSERT CATEGORY 
      IF @CategoryParentId IS NULL 
      BEGIN 
       IF NOT EXISTS (SELECT * FROM [mydatabase].[myschema].[Categories] WHERE CategoryName = @CategoryName AND CategoryParentId IS NULL) 
         INSERT INTO [mydatabase].[myschema].[Categories] (CategoryName, CategoryParentId) 
         VALUES (@CategoryName, @CategoryParentId) 
      END 
      ELSE 
      BEGIN     
       IF NOT EXISTS (SELECT * FROM [mydatabase].[myschema].[Categories] WHERE CategoryName = @CategoryName AND CategoryParentId = @CategoryParentId)      
         INSERT INTO [mydatabase].[myschema].[Categories] (CategoryName, CategoryParentId) 
          VALUES (@CategoryName, @CategoryParentId)            
      END 

      SET @CategoryId = @@IDENTITY; 

      IF @CategoryId IS NULL 
       SELECT @CategoryId = Id FROM [mydatabase].[myschema].[Categories] WHERE CategoryName = @CategoryName 

      COMMIT TRANSACTION [InsertCategoryTrans]; 

      IF @FieldCode IS NOT NULL AND NOT EXISTS (SELECT * FROM [mydatabase].[myschema].[Fields] WHERE CategoryId = @CategoryId AND FieldCode = @FieldCode) 
      BEGIN 
       BEGIN TRANSACTION [InsertCategoryFieldTrans]; 
        INSERT INTO [mydatabase].[myschema].[Fields] (CategoryId, FieldCode) 
        VALUES (@CategoryId, @FieldCode)  
       COMMIT TRANSACTION [InsertCategoryFieldTrans]; 
      END 

    END TRY 
    BEGIN CATCH 
     ROLLBACK TRANSACTION [InsertCategoryTrans]; 
     SELECT ERROR_MESSAGE() AS [Message], ERROR_LINE() AS [Line] 
    END CATCH 
    END');