【发布时间】:2016-12-03 04:25:37
【问题描述】:
使用 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”,列 “身份证”。
提前谢谢你!
【问题讨论】:
-
这没有帮助,请阅读问题。我可以一个一个地运行每个执行。只有批量我不能....
-
您是否尝试过在每个 exec 命令之后使用“GO”命令?
-
我做了,还是不行:(
标签: sql sql-server stored-procedures foreign-keys ssms