2016-12-03 11 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-conflicted-with-foreign-key-constraint –

+0

それは役に立たないので、質問をお読みください。私はそれぞれを1つずつ実行することができます。一括でしかできません.... – TiagoM

+1

それぞれのexecコマンドの後に 'GO'コマンドを使ってみましたか? – khaled4vokalz

答えて

0

さて問題は、私はトランザクションをコミットし、2つの異なるトランザクションに単一のトランザクションを分離した方法を変更する修正されました、ここで誰かが

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'); 
関連する問題