Sql server 简单的逻辑,但不能正常工作
这就是我想要实现的目标: 所以,当插入opp_type=0的记录时,触发opportunities表 代码的下一部分只是进行计算,即从自定义表中提取最后使用的数字并向其中添加1。在变量中存储新值 下一部分是在用户字段中插入。 最后更新自定义表以记录上次使用的编号 我在NEXTEXP1表中得到一个递增的数字,但是名为O_Quote的用户字段没有通过GUI填充 根据上面的解释,下面的代码是否做了它应该做的事情 按照我的触发器中的步骤,看起来是一样的,但用户字段没有填充最后使用的数字:Sql server 简单的逻辑,但不能正常工作,sql-server,triggers,Sql Server,Triggers,这就是我想要实现的目标: 所以,当插入opp_type=0的记录时,触发opportunities表 代码的下一部分只是进行计算,即从自定义表中提取最后使用的数字并向其中添加1。在变量中存储新值 下一部分是在用户字段中插入。 最后更新自定义表以记录上次使用的编号 我在NEXTEXP1表中得到一个递增的数字,但是名为O_Quote的用户字段没有通过GUI填充 根据上面的解释,下面的代码是否做了它应该做的事情 按照我的触发器中的步骤,看起来是一样的,但用户字段没有填充最后使用的数字: alter T
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。因此,使用适合的变量。如果您对触发器的现状感到满意,那么问题是您没有设置插入时使用的任何变量。根据需要设置它们,它是“固定”的。这完全取决于您如何进行,但无论如何,我强烈建议您重新编写触发器,以适应表中插入的多条记录。在另一个已经发布的答案中有一个例子。调查一下。