Tsql 使用insert into select时,触发器仅触发一个

Tsql 使用insert into select时,触发器仅触发一个,tsql,Tsql,它可以很好地插入单个记录,但我使用Insert into tbl从另一个表中选择tbl值来插入多个记录,它只影响最后一个记录。。。 为什么???Insert语句即使将多行视为单个操作,也必须自己处理触发器代码中插入的值 试试这个: CREATE TRIGGER tg_bpb_cons_no ON dbo.t_bpb_cons FOR INSERT AS /* fungsi : membuat document bon permintaan barang maintenance number s

它可以很好地插入单个记录,但我使用Insert into tbl从另一个表中选择tbl值来插入多个记录,它只影响最后一个记录。。。 为什么???

Insert语句即使将多行视为单个操作,也必须自己处理触发器代码中插入的值

试试这个:

CREATE TRIGGER tg_bpb_cons_no ON dbo.t_bpb_cons
FOR INSERT
AS
/*
fungsi  : membuat document bon permintaan barang maintenance number secara otomatis`
author  : ryan
*/
declare @new_doc_no varchar(20)
declare @doc_no varchar(20)
--declare @doc_no bigint
--update doc no
SELECT @doc_no = max(cast(substring(doc_no,9,13) as integer)) from t_bpb_cons
IF (@doc_no IS NULL)
BEGIN
set @doc_no = 0
END
PRINT @DOC_NO
SELECT @new_doc_no = cast(@doc_no+1 as varchar(20))
SELECT @new_doc_no = LEFT('BPB/CON/',8+len(@new_doc_no))+@new_doc_no
UPDATE t_bpb_cons SET doc_no=@new_doc_no WHERE [ID]=(SELECT MAX([ID]) AS id from t_bpb_cons)

我想SQL Server可能就是Sybase。您使用的是什么版本?另外,您是否考虑过将doc_no列拆分为两列,或者仅一列存储int部分并使用计算列进行格式化?这将使这变得更容易,并消除所有恼人的字符串转换。
CREATE TRIGGER tg_bpb_cons_no ON dbo.t_bpb_cons
FOR INSERT
AS
/*
fungsi  : membuat document bon permintaan barang maintenance number secara otomatis`
author  : ryan
*/
declare @new_doc_no varchar(20)
declare @doc_no int
declare @row_inserted int

select @row_inserted = count(*) from inserted
--declare @doc_no bigint
--update doc no
SELECT @doc_no = max(cast(substring(doc_no,9,13) as integer)) from t_bpb_cons
IF (@doc_no IS NULL)
BEGIN
set @doc_no = 0
END
WHILE @doc_no < @doc_no + @row_inserted
BEGIN
    PRINT @DOC_NO
    SELECT @new_doc_no = cast(@doc_no+1 as varchar(20))
    SELECT @new_doc_no = LEFT('BPB/CON/',8+len(@new_doc_no))+@new_doc_no
    UPDATE t_bpb_cons SET doc_no=@new_doc_no WHERE [ID] = (SELECT MAX([ID]) AS id from inserted)
    SET @doc_no = @doc_no + 1
END