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

Sql server 简单的逻辑,但不能正常工作,sql-server,triggers,Sql Server,Triggers,这就是我想要实现的目标: 所以,当插入opp_type=0的记录时,触发opportunities表 代码的下一部分只是进行计算,即从自定义表中提取最后使用的数字并向其中添加1。在变量中存储新值 下一部分是在用户字段中插入。 最后更新自定义表以记录上次使用的编号 我在NEXTEXP1表中得到一个递增的数字,但是名为O_Quote的用户字段没有通过GUI填充 根据上面的解释,下面的代码是否做了它应该做的事情 按照我的触发器中的步骤,看起来是一样的,但用户字段没有填充最后使用的数字: alter T

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

所以,当插入opp_type=0的记录时,触发opportunities表

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

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

我在NEXTEXP1表中得到一个递增的数字,但是名为O_Quote的用户字段没有通过GUI填充

根据上面的解释,下面的代码是否做了它应该做的事情

按照我的触发器中的步骤,看起来是一样的,但用户字段没有填充最后使用的数字:

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

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

从“插入”菜单中选择@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,这并不理想。你能看看使用标识栏吗?

@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

什么是@NextQNo,它没有设置在任何地方。另一方面,如果插入多条记录会发生什么情况,触发器的行为如何?它的编写方式将导致您出现问题,并且不会插入所有记录。GUI上的用户一次只能插入一条记录,不能插入多条记录。Opp_type是Opportunity记录的唯一标识符,它始终为0。我需要将最后使用的数字传输到O_Quote中,所以我猜这将是@nextq。尽管UI不够公平,但如果有人将一堆记录导入到该表中会怎么样?触发器的行为将不符合预期。只要你知道,那就好了。如果Opp_类型始终为0,那么按照您的方式设置它,然后使用If检查它的逻辑是什么?这是多余的。用户确实有导入记录的功能。我正在寻找实现我所需要的最好的方法。我对这样的触发器很陌生。因此,我在我的代码中就是这样写的。如果你能告诉我更好的方法,学习新东西总是很好的。我提出的代码显示了如何获取驻留在表中的数字,以及“新数字”,也就是这个数字加1。因此,使用适合的变量。如果您对触发器的现状感到满意,那么问题是您没有设置插入时使用的任何变量。根据需要设置它们,它是“固定”的。这完全取决于您如何进行,但无论如何,我强烈建议您重新编写触发器,以适应表中插入的多条记录。在另一个已经发布的答案中有一个例子。调查一下。