【问题标题】:Executing multiple stored procedures is causing an error [using Transaction]执行多个存储过程导致错误[使用事务]
【发布时间】: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


【解决方案1】:

这个问题已经解决,改变了我提交事务的方式,并将单个事务分成两个不同的事务,如果有人需要,这是生成的代码

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');

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 2012-02-26
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多