我对SQL Server中的触发器非常陌生,所以我希望有人能够帮助或至少将我指向正确的方向。SQL Server触发器在插入表之前验证数据
我有一个表有多个记录插入到它的作业我想在插入前验证这些记录,然后如果它不符合要求raiseerror。
我创建了一个视图,试图使之更容易解释什么,我试图做
SELECT TOP (100) PERCENT
iJCMasterID,
SUM(CASE WHEN ubJCTxSTNoProint = 1
THEN fTransQty * ufJCTxSTCustomerCharge
ELSE 0
END) AS CustCharge,
SUM(CASE WHEN iStockID = 5774 THEN 1 ELSE 0 END) AS ValidateJoblot,
SUM(CASE WHEN iStockID = 5774 THEN fUnitPriceExcl * fTransQty ELSE 0 END) AS JobTotal
FROM
dbo._btblJCTxLines
GROUP BY
iJCMasterID, dStartDate
HAVING
(SUM(CASE WHEN iStockID = 5774 THEN 1 ELSE 0 END) > 0)
所以一切都是由iJCMasterID
分组,我需要基本确认包含CustCharge = Jobtotal
但仅限于工作作业很多是在Having
条款进场
如果你需要帮助的任何其他信息,请让我知道
谢谢你的提前
这是我迄今为止尝试,但似乎并不奏效
USE [*******DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[ValidateCC] ON [dbo].[_btblJCTxlines] for insert, update AS
begin
if exists(select COUNT(*) from inserted)--drop TRIGGER [dbo].[JobOverCreditLimit]
declare @Jobamount float
SET @Jobamount = (select sum(fLineTotalExcl) as JobAmount from inserted
where iStockID = 5774
GROUP BY inserted.iJCMasterID)
declare @CCAmount float
SET @CCAmount = (select sum(fTransQty * ufJCTxSTCustomerCharge) as JobAmount from inserted
where ubJCTxSTNoProint = 1
GROUP BY inserted.iJCMasterID)
declare @Validation float
set @Validation = (@Jobamount - @CCAmount)
IF @Validation <> 0
BEGIN
DECLARE @EMSG VARCHAR(500)
SET @EMSG = 'Customer Charge R' + CAST(@CCAmount AS VARCHAR(20))+' does not equal Job Amount R'+ CAST(@CCAmount AS VARCHAR(20))+ ''
BEGIN
rollback tran
RAISERROR (@EMSG ,16, 1)
end
END
end
为什么要存储该值?为什么不在需要时计算它? –
嗨戈登我已经在我原来的帖子上做了一个编辑,实际上并不想将值存储在另一个表中,只是希望触发器在插入或引发错误之前将其插入帖子中以供引用,但它似乎并不正在工作 –