【问题标题】:Insert inside a stored procedure在存储过程中插入
【发布时间】:2019-04-28 06:31:31
【问题描述】:

我正在存储过程中编写插入语句。当我为 SKU 插入重复值时,我没有得到 ​​p>

尝试插入 ProductPrice 表时出错

@errValue

我不知道为什么?它只是说语句终止

ALTER PROCEDURE HW5INS1
    -- PRODUCTPRICE TABLE: LEVEL-1
    @SKU VARCHAR(64),
    @startDate DATE,
    @endDate DATE = NULL,---NOT REQUIRED
    @price SMALLMONEY
AS
BEGIN TRANSACTION
    -- Test For Existence Of Parent Row: LOOK INTO PRODUCTS TABLE
    IF EXISTS (SELECT SKU FROM Products WHERE SKU = @SKU)
    BEGIN
        INSERT INTO ProductPrices (SKU, startDate, endDate, price)
        VALUES (@SKU, @startDate, @endDate, @price)

        SELECT * FROM ProductPrices

        DECLARE @errValue INT
        SET @errValue = @@ERROR

        IF (@@ERROR <>0)
        BEGIN
            PRINT 'Error occurred while trying to insert the ProductPrice table'
            PRINT @errValue
            RETURN -11001
        END
    END
    ELSE
    BEGIN
        -- PARENT DOES NOT EXIST, RETURN ERROR
        PRINT 'Error: PARENT DOESNOT EXIST'
        RETURN -11002
    END

    COMMIT TRANSACTION
    RETURN

【问题讨论】:

  • 该错误是自定义错误,实际上并没有告诉我们问题所在。发生的真正错误是什么?
  • 尝试IF @errValue &lt;&gt; 0 而不是'IF (@@ERROR 0)'。 @@ERROR 在每个语句之后设置。
  • 我希望查询返回在尝试插入 ProductPrice 表和 PRINT @errValue 时发生的错误,但它只是说重复的键值和语句终止而不打印任何内容。
  • 附带说明,通常您会在TRY...CATCH 中使用类似的事务。您的COMMIT 位于SP 的末尾,因此在发生错误时永远不会到达,但您没有ROLLBACK。这可能会给您带来一些问题。
  • @DanGuzman 仍然没有显示

标签: sql sql-server tsql stored-procedures


【解决方案1】:

评论太长了。

您正试图在存储过程中复制数据库功能。这是一个坏主意。一个是——由于竞争条件——你不能像数据库一样好。其次是你可能得到了正确的代码,但其他代码可能会更新/插入/删除行并导致问题。

你想要的两件事是外键约束和唯一约束:

alter table ProductPrices add constraint fk_productprices_sku
    foreign key (sku) reference products(sku);

alter table ProductPrices add constraint unq_productprices_sku
    unique (sku);

您可以捕获错误以重命名它们。这似乎是多余的努力(在我看来)。只需给约束赋予有意义的名称,然后让数据库完成它的工作。

【讨论】:

    【解决方案2】:

    尝试以这种方式重写你的 SP。

    ALTER PROCEDURE HW5INS1
    
    ------PRODUCTPRICE TABLE: LEVEL-1
        @SKU varchar(64),
        @startDate date,
        @endDate date = NULL,---NOT REQUIRED
        @price smallmoney
    AS
    
    
    ---------Test For Existence Of Parent Row: LOOK INTO PRODUCTS TABLE
    If Exists(Select SKU from Products where SKU = @SKU)
          BEGIN
    BEGIN TRANSACTION
    begin try
             INSERT INTO ProductPrices (SKU, startDate, endDate, price)
    VALUES (@SKU, @startDate, @endDate, @price)
    commit
    end try
    begin catch
               --select * from ProductPrices
             DECLARE @errValue int
             SET @errValue=@@ERROR
    rollback
             IF (@ERROR <>0)
               BEGIN
                 PRINT 'Error Occured While Trying To Insert The ProductPrice Table'
                 PRINT @errValue
                 RETURN -11001
               END
    end catch
          END
    ELSE
      BEGIN
      -----PARENT DOESNOT EXIST, RETURN ERROR
        PRINT 'Error: PARENT DOESNOT EXIST'
        RETURN -11002
      END
    
    RETURN
    

    【讨论】:

    • 尝试插入 ProductPrice 表时发生错误 2627 消息 266,级别 16,状态 2,过程 HW5INS1,第 7 行 EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 5,当前计数 = 0。我收到此不匹配错误也不知道为什么。
    • 尝试重启 SQL server。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多