大家能帮我看一下这个触发器吗?如果我批量插人记录 就会出错

OutcastXP 2007-04-04 10:21:20
CREATE TRIGGER [Tr_DNFNO] ON [dbo].[DisNoteFit]
FOR INSERT
AS
IF (SELECT DNFNO FROM INSERTED) IS NULL OR (SELECT DNFNO FROM INSERTED) = 0
BEGIN
UPDATE A
SET DNFNO=(SELECT MAX(DNFNO)+1 FROM DisNoteFit
WHERE DNMNum=A.DNMNum AND DNCNum=A.DNCNum AND DNFNum<=A.DNFNum)
FROM DisNoteFit A JOIN INSERTED B on A.DNFNum=B.DNFNum
END
...全文
297 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
OutcastXP 2007-04-05
  • 打赏
  • 举报
回复
谢谢:libin_ftsafe(子陌红尘:当libin告别ftsafe)

虽然你帮我写的触发器有点问题
但你提供了我的思路 呵呵......
子陌红尘 2007-04-05
  • 打赏
  • 举报
回复
CREATE TRIGGER [Tr_DNFNO] ON [dbo].[DisNoteFit]
FOR INSERT
AS
BEGIN
DECLARE @DNFNum INT,@DNCNum INT,@I INT

DECLARE TC CURSOR FOR
SELECT DNFNum,DNCNum FROM INSERTED WHERE DNFNO IS NULL OR DNFNO=0

OPEN TC
FETCH NEXT FROM TC INTO @DNFNum,@DNCNum

WHILE @@FETCH_STATUS=0
BEGIN
SELECT @I=ISNULL(MAX(DNFNO),0) FROM DisNoteFit WHERE DNMNum=@DNMNum AND DNCNum=@DNCNum

UPDATE DisNoteFit SET @I=@I+1,DNFNO=@I WHERE DNMNum=@DNMNum AND DNCNum=@DNCNum

FETCH NEXT FROM TC INTO @DNFNum,@DNCNum
END

CLOSE TC
DEALLOCATE TC
END
GO
OutcastXP 2007-04-04
  • 打赏
  • 举报
回复
TO:libin_ftsafe(子陌红尘:当libin告别ftsafe)

你改的那个触发器DNFNO的值是一样的

比如DNMNum=42 DNCNum=9 我批量插入5个记录
那么DNFNO 就应该是1到5的排序

我需要的是DNFNO(序号)是根据DNMNum(主表ID)同DNCNum(记录类别ID)自动排序
子陌红尘 2007-04-04
  • 打赏
  • 举报
回复
我先写循环语句插入好了
大家帮我想好了办法我再改
我哭
--------------------------------------------------------------
我改写的那个触发器应该可以处理如楼主描述的批量insert的情况。
OracleRoob 2007-04-04
  • 打赏
  • 举报
回复
子陌兄也在啊
OutcastXP 2007-04-04
  • 打赏
  • 举报
回复
我先写循环语句插入好了
大家帮我想好了办法我再改
我哭
OutcastXP 2007-04-04
  • 打赏
  • 举报
回复
难道要我写个循环一条一条插进去吗

我晕
OutcastXP 2007-04-04
  • 打赏
  • 举报
回复
我的表结构如下:
字段名 数据类型 标示种子 说明
DNFNum int 1 ID
DNMNum int 主表ID
DNCNum int 记录类别ID
DNFNO int 序号
DNFTime datetime 时间
Note varchar(900) 记录

这个DNFNO(序号)是根据DNMNum(主表ID)同DNCNum(记录类别ID)自动排序的
我的触发器就是起这个作用

但我批量插人就会出问题



楼上的你们告诉我的在批量插入时候DNFNO的值是一样的 那么这样就没有效果了 晕
dawugui 2007-04-04
  • 打赏
  • 举报
回复
钻石老大出手,应该没问题了.
OutcastXP 2007-04-04
  • 打赏
  • 举报
回复
一条记录这样加是一点问题都没有的
子陌红尘 2007-04-04
  • 打赏
  • 举报
回复
TRY:
--------------------------------------------------------------------------------
CREATE TRIGGER [Tr_DNFNO] ON [dbo].[DisNoteFit]
FOR INSERT
AS
UPDATE A
SET
DNFNO=(SELECT
MAX(DNFNO)+1
FROM
DisNoteFit
WHERE
DNMNum=A.DNMNum AND DNCNum=A.DNCNum AND DNFNum<=A.DNFNum)
FROM
DisNoteFit A
JOIN
INSERTED B
on
A.DNFNum=B.DNFNum
and
(B.DNFNO is null or B.DNFNO=0)
GO
OutcastXP 2007-04-04
  • 打赏
  • 举报
回复
我的表结构如下:
字段名 数据类型 标示种子 说明
DNFNum int 1 ID
DNMNum int 主表ID
DNCNum int 记录类别ID
DNFNO int 序号
DNFTime datetime 时间
Note varchar(900) 记录

这个DNFNO(序号)是根据DNMNum(主表ID)自动排序的
我的触发器就是起这个作用

但我批量插人就会出问题
dawugui 2007-04-04
  • 打赏
  • 举报
回复
手工每次插入一条记录后检查通过上面的查询能否得到你需要的DNFNO
dawugui 2007-04-04
  • 打赏
  • 举报
回复
这段条件有问题.

WHERE DNMNum=A.DNMNum AND DNCNum=A.DNCNum AND DNFNum<=A.DNFNum)
FROM DisNoteFit A JOIN INSERTED B on A.DNFNum=B.DNFNum
OutcastXP 2007-04-04
  • 打赏
  • 举报
回复
比如我的这个插入语句
insert into DisNoteFit(DNMNum,DNCNum,Note) select 42, 9, FJNote from FixJXP where FJTime between '2007-04-28 22:1' and '2007-05-02 22:1'
OutcastXP 2007-04-04
  • 打赏
  • 举报
回复
TO:dawugui
按你的改DNFNO的值也全是1
我要DNFNO这个字段按DNMNum的区别自动排序的

dawugui 2007-04-04
  • 打赏
  • 举报
回复
批量插人?把那句判断去掉.然后加为空时,dnfno = 0

CREATE TRIGGER [Tr_DNFNO] ON [dbo].[DisNoteFit]
FOR INSERT
AS
BEGIN
UPDATE A
SET DNFNO=(SELECT isnull(MAX(DNFNO),0)+1 FROM DisNoteFit
WHERE DNMNum=A.DNMNum AND DNCNum=A.DNCNum AND DNFNum<=A.DNFNum)
FROM DisNoteFit A JOIN INSERTED B on A.DNFNum=B.DNFNum
END
OutcastXP 2007-04-04
  • 打赏
  • 举报
回复
如果我不加那个if语句
批量插入的时候不会报错
但DNFNO的值全是1

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧