简单的逻辑但不能正常工作

时间:2017-10-24 10:21:52

标签: sql-server triggers

这就是我想要实现的目标:

因此,当插入具有opp_type = 0的记录时,触发机会表上的触发。

代码的下一部分只是进行计算,即从自定义表中获取最后使用的数字并向其中添加1。在变量中存储新值。

下一部分是插入用户字段。 最后更新自定义表以记录上次使用的数字。

我在NEXTEXP1表中将数字增加1,但是没有通过GUI填充名为O_Quote的用户字段。

下面的代码在上面的解释方面做了它应该做的事情吗?

通过我的触发器中的步骤看起来相同,但用户字段没有填充使用的最后一个数字:

alter TRIGGER [dbo].[Q2] ON  [dbo].[AMGR_opportunity_Tbl] AFTER INSERT
AS 
BEGIN

Declare @Opp_Type int

Select @Opp_Type = 0 from inserted

If @Opp_Type = 0

  BEGIN

    SET NOCOUNT ON;

    DECLARE @Client_Id varchar(24)
    DECLARE @Contact_Number int
    DECLARE @NewNumber varchar(250)
    DECLARE @NextQNo float
    DECLARE @UDFName varchar(50)
    DECLARE @GeneratorPrefix varchar(10)
    DECLARE @GeneratorLength float
    DECLARE @Opptype int
    DECLARE @Type_id int
    DECLARE @Oppid varchar (24)


    --select top 1 nextqno = nextqno from nextexp1
    SELECT @NewNumber = NextQno + 1 from dbo.NextEXP1

    ----insert into user field
    insert into O_Quote(Client_Id, Contact_Number, Type_Id, Code_Id, [O_Quote])
    values (@Client_Id,0,15,0,@NextQNo)

    -------update table with last number used
UPDATE [dbo].[NextEXP1] SET NextQNo = @NewNumber


    End

    End

GO

2 个答案:

答案 0 :(得分:1)

@ Leonidas199x对所有积分都是正确的。我还可以说,有太多的东西不清楚这些问题,而且很多数据都缺失了,但这是我可以建议的(这段代码也处理批量插入):

alter TRIGGER [dbo].[Q2] ON  [dbo].[AMGR_opportunity_Tbl] AFTER INSERT
AS 
BEGIN
   DECLARE @NewNumber varchar(250);
   SELECT @NewNumber = MAX(NextQno) FROM dbo.NextEXP1; -- I guess that's what you want

    insert into O_Quote(Client_Id, Contact_Number, Type_Id, Code_Id, [O_Quote])
    select Client_Id, Contact_Number, Type_Id, Code_Id, @NewNumber + row_num
    FROM (
            SELECT Client_Id, -- once again do not know where this value is taken from
                  0 Contact_Number,
                  15 Type_Id,
                   0 AS Code_Id,
            ROW_NUMBER() OVER(order by client_id) row_num
            FROM INSERTED WHERE Opp_Type = 0 --I guess that's the right column name
    ) a;

    SELECT @NewNumber = MAX(O_Quote) FROM O_Quote;

    UPDATE [dbo].[NextEXP1] SET NextQNo = @NewNumber;
END

答案 1 :(得分:0)

考虑到这一点,我认为你的逻辑有点偏差:

  

从插入

中选择@Opp_Type = 0

这将始终评估为0。

您想使用:

SELECT  @Opp_Type   =   i.Opp_Type 
FROM    inserted    AS  i;

i.Opp_Type是您的列名。

其次,您声明了一堆变量,但从未设置它们:

    DECLARE @Client_Id varchar(24)
    DECLARE @Contact_Number int
    DECLARE @NewNumber varchar(250)
    DECLARE @NextQNo float
    DECLARE @UDFName varchar(50)
    DECLARE @GeneratorPrefix varchar(10)
    DECLARE @GeneratorLength float
    DECLARE @Opptype int
    DECLARE @Type_id int
    DECLARE @Oppid varchar (24)

然后继续插入它们。如果您想稍后使用它们,则需要设置它们。应该是:

insert into O_Quote(Client_Id, Contact_Number, Type_Id, Code_Id, [O_Quote])
values (@Client_Id,0,15,0,@NewNumber)

或者您需要将@NextQNo设置为:

SELECT @NextQNo   = NextQno from dbo.NextEXP1;
SELECT @NewNumber = @NextQNo + 1;

最后,如果一次插入多条记录,写入方式会导致问题。你需要考虑一个循环来获得那个不理想的MaxID。你能看一下使用IDENTITY列吗?