Sql 在存储过程中插入
我正在存储过程中编写insert语句。当我为SKU插入重复值时,我没有得到 尝试插入ProductPrice表时出错 和@errValue 我不知道为什么?只是说声明终止了Sql 在存储过程中插入,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我正在存储过程中编写insert语句。当我为SKU插入重复值时,我没有得到 尝试插入ProductPrice表时出错 和@errValue 我不知道为什么?只是说声明终止了 ALTER PROCEDURE HW5INS1 -- PRODUCTPRICE TABLE: LEVEL-1 @SKU VARCHAR(64), @startDate DATE, @endDate DATE = NULL,---NOT REQUIRED @price SMALLMONE
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
尝试以这种方式重写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
这篇评论太长了 您正试图在存储过程中复制数据库功能。这是个坏主意。一个是,由于比赛条件的原因,你不能像数据库那样出色。第二个问题是,您可能会正确使用此代码,但其他代码可能会更新/插入/删除行并导致问题 您需要的两个约束是外键约束和唯一约束:
alter table ProductPrices add constraint fk_productprices_sku
foreign key (sku) reference products(sku);
alter table ProductPrices add constraint unq_productprices_sku
unique (sku);
您可以捕获错误以重命名它们。在我看来,这似乎是多余的努力。只需给约束指定有意义的名称,让数据库完成它的工作。该错误是一个自定义错误,实际上并没有告诉我们问题所在。发生的真正错误是什么?请尝试使用IF@errValue 0而不是“IF@@error 0”@@每个语句后都会设置错误。我希望查询返回在尝试插入ProductPrice表并打印@errValue时发生的错误,但它只是说重复的键值,语句终止,而没有打印任何内容。另一方面,通常,您会在TRY…CATCH中使用这样的事务。您的提交位于SP的末尾,因此在发生错误时将永远无法到达,但您没有回滚。这可能会给您带来一些问题。@DanGuzman its not displayingError在尝试插入ProductPrice表2627 Msg 266,级别16,状态2,过程HW5INS1,执行后第7行事务计数时发生错误,表示BEGIN和COMMIT语句的数量不匹配。上一次计数=5,当前计数=0。我收到此不匹配错误,也不知道原因。请尝试重新启动SQL server。