MS SQL插入触发器检查列中的正确数字格式

时间:2018-06-08 12:29:02

标签: sql-server tsql sql-server-2012 triggers

我 需要一些代码建议,

在打印出优惠时,我们的ERP程序会在表格中生成一个ID号码" Angebot"在格式AYYNNNNN中,此掩码在管理设置中设置,但它也有一个选项来覆盖此数字并设置一个手动,这会导致很多麻烦,因为人们往往会破坏ID计数器。

我想创建一个触发器,当id号格式不正确时发送消息,因此我必须检查该特定列是否正确。

if状态会检查以下内容:

if (Angebotsnr NOT LIKE 'A'+RIGHT(DATEPART(yy,getdate())+'_____') then RAISEERROR

数据库中已经存在一个检查其他东西的触发器,所以我只需要添加第二个检查以确保它是正确的,但是我将把if语句放在哪里以及如何检查它? / p>

这是现有触发器的代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER TRIGGER [dbo].[ANGEBOT_ITrig] ON [dbo].[Angebot] FOR INSERT AS
SET NOCOUNT ON
/* * KEINE EINFÜGUNG BEI FEHLEN EINES PASSENDEN SCHLÜSSELS IN 'ErlGrp' */
IF (SELECT COUNT(*) FROM inserted) !=
   (SELECT COUNT(*) FROM ErlGrp, inserted WHERE (ErlGrp.ABTNR = inserted.ABTEILUNG))
    BEGIN
        RAISERROR ( 'Some error statement',0,0)
        ROLLBACK TRANSACTION
    END

操作将是相同的,只是使用不同的错误消息。 有人能指出我正确的方向。

感谢。

1 个答案:

答案 0 :(得分:0)

我会在执行插入的过程中处理此问题,因此它不会插入并触发其他触发器。

create proc myInsertProc (@ID char(8))
as
begin
    --copied from you, but it's missing part of the right function
    if (Angebotsnr NOT LIKE 'A'+RIGHT(DATEPART(yy,getdate())+'_____') 
    begin
        raiserror('You provided a wrongly formatted ID',16,1) with log
        return
    end
    ...continue on with other code
end

这将引发错误,并将其写入SQL Server错误日志。如果您不想要,可以删除with logreturn结束批处理。如果你是

,你也可以在插入的try catch中包装它

我个人在IF区块使用此功能。

if (Angebotsnr NOT LIKE 'A' + right(convert(varchar,DATEPART(year,getdate())),2) + '%' or len(Angebotsnr) != 8)