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'で発生しました。
ありがとうございます!
http://stackoverflow.com/を必要とする場合は、結果のコードがあります質問/ 2965837/insert-statement-conflicted-with-foreign-key-constraint –
それは役に立たないので、質問をお読みください。私はそれぞれを1つずつ実行することができます。一括でしかできません.... – TiagoM
それぞれのexecコマンドの後に 'GO'コマンドを使ってみましたか? – khaled4vokalz