日期:2014-05-18  浏览次数:20535 次

触发器中的奇怪问题

下面是表Table_1的触发器的一部分:

  -- 每次向表Table_1中插入数据时,都要根据@LoginName找出另一个表(Table_2)中Data1字段的值,并将它赋予@ID,如果T2的值为null,则赋予@ID 5个字符0
  -- @LoginName:用户号,每个用户号对应于唯一的UserName

begin
  select @ID=T2 from Table_2 where UserName = @LoginName
  if (@ID is null) set @ID='00000'

  insert into Table_3( LoginName, ID ) values( @LoginName, @ID )

  ……
end


问题:在SQLServer 2000中,当向Table_1插入多次数据之后,发现其中有两条插入表中的时间是连着的记录中,那两条记录的@LoginName是一样的,但总是前一条记录的@ID能正常由Table_2检索出来,而后面一条的@ID却为"00000"。前一条能正常检索出数据,后一条为什么就不能正常检索数据呢???? 好奇怪!!!!

还请高手教教我, 谢谢!!




------解决方案--------------------
select @ID=T2 from Table_2 where UserName = @LoginName 

username可以重复,在加有个条件试一下
------解决方案--------------------
begin 
set @id is null --加多一句试试?
select @ID=T2 from Table_2 where UserName = @LoginName 
if (@ID is null) set @ID= '00000 ' 

insert into Table_3( LoginName, ID ) values( @LoginName, @ID ) 

…… 
end 

------解决方案--------------------
这要看前面的逻辑,尤其是@LoginName前面是怎么获得的。

最大的可能是批量插入导致,比如一次插入两条记录。
------解决方案--------------------
SQL code
/*
begin 
    set @id is null --加多一句试试?
    select @ID=T2 from Table_2 where  UserName = @LoginName 
    if (@ID is null)  set  @ID=  '00000  ' 

    insert into Table_3( LoginName, ID )  values( @LoginName, @ID ) 

    …… 
end  
……
@LoginName 是由插入Table_1的参数值中截取出来的。
数据是大量插入Table_1的,1秒之内可能也会插入2条以上。

-----------------------------

批量和大量是两回事,批量是一次性插入多条,大量只能说明插入频繁。

假设你的@LoginName是这样截取的:left(Table_1.参数值字段,10)

下面给出处理批量插入的代码:
*/

insert into Table_3(LoginName,ID)
    select left(a.参数值字段,10),isnull(b.ID,'00000'
        from INSERTED a left join Table_2 b on left(a.参数值字段,10)=b.UserName

------解决方案--------------------
SQL code
--笔误
insert into Table_3(LoginName,ID)
    select left(a.参数值字段,10),isnull(b.ID,'00000')
        from INSERTED a left join Table_2 b on left(a.参数值字段,10)=b.UserName