我正在存储过程中编写一条插入语句。插入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
答案 0 :(得分: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);
您可以捕获错误以将其重命名。 (在我看来)这似乎是多余的工作。只需给约束指定有意义的名称,然后让数据库完成其工作即可。
答案 1 :(得分:0)
尝试以此方式重写您的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