Вставить внутри хранимой процедуры - PullRequest
0 голосов
/ 27 апреля 2019

Я пишу оператор вставки внутри хранимой процедуры. Когда я вставляю дублирующее значение для SKU, я не получаю

Ошибка при попытке вставить таблицу 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

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Это слишком долго для комментария.

Вы пытаетесь воспроизвести функциональность базы данных в хранимой процедуре. Это плохая идея. Одним из них является то, что из-за условий гонки вы не можете сделать так же хорошо, как база данных. Во-вторых, вы можете получить этот код правильно, но другой код может обновить / вставить / удалить строки и вызвать проблемы.

Две вещи, которые вы хотите, это ограничение внешнего ключа и ограничение уникальности:

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

alter table ProductPrices add constraint unq_productprices_sku
    unique (sku);

Вы можете зафиксировать ошибки, чтобы переименовать их. Это кажется лишним усилием (на мой взгляд). Просто дайте ограничениям значимые имена и дайте базе данных выполнить свою работу.

0 голосов
/ 27 апреля 2019

Попробуйте переписать ваш 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...