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-conflict-with-the-foreign-key-constraint –
that does not help,please read the question。我可以逐個運行每個執行。只有在批量我不能...... – TiagoM
您是否嘗試過每個執行命令後使用'GO'命令? – khaled4vokalz