高难度问题:这个触发器怎么写?(200分)

  • 主题发起人 主题发起人 exceed
  • 开始时间 开始时间
E

exceed

Unregistered / Unconfirmed
GUEST, unregistred user!
这个触发器怎么写?
表A: (sendto varchar(255),id (唯一字段) )
表B: (userid char(30),id(唯一字段))
向A插入数据:
insert into A(sendto) values("zhanghua,lanshan,gaodonghua")
现在要将上面的人名分开插到B表中去


 
其实这个要分开并不难,不过看当表b PK重复看你如何处理而已,
用WHILE
Create Trigger InsertB
On TableA
for Insert
As
begin
Declare @userName varchar(30),@UserGroup varchar(255)
Declare @iStart int,@iEnd int
Select @UserGroup=SendTo from Inserted
Set @iStart=0
Set @iEnd=@iStart
Set @iEnd=CHARINDEX(@UserGroup,',',@iStart)
while @iEnd>@iStart
begin
Set @userName=SUBSTRING(@UserGroup,@iStart,@iEnd-@iStart-1)
Insert into Table2 values (@UserName)
Set @iEnd=@iStart
Set @iEnd=CHARINDEX(@UserGroup,',',@iStart)
end
Set @userName=SUBSTRING(@UserGroup,@iStart,Len(@UserGroup)-@iStart-1)
Insert into Table2 values (@UserName)
end

大概是这样有些细节的东西自己去调试
 
确发器能这样写吗?
我觉得就用存储过程呀!
听一下
 
riversoft,谢谢你帮我一大忙!
 
接受答案了.
 
如果是Oracle数据库的话,下面这个触发器就可以用了:
create or replace trigger Test
before insert on Table0
for each row

declare
v_Name varchar2(200);
I Integer;
function GetSubStr(
p_Str varchar2,
p_Index number,
p_Separator varchar2 default ',')
return varchar2 is
P1 number;
P2 number;
SepLen number;
TmpStr varchar2(32767);
AddTail boolean;
begin
if p_Index < 1 then
return NULL;
end if;

SepLen := LENGTH(p_Separator);
TmpStr := LTRIM(RTRIM(p_Str));
AddTail :=
LENGTH(LTRIM(RTRIM(TmpStr))) > 0
and SUBSTR(TmpStr, LENGTH(TmpStr) - SepLen + 1, SepLen) <> p_Separator;

if AddTail then
TmpStr := TmpStr || p_Separator;
end if;

if p_Index = 1 then
P1 := 0;
else
P1 := INSTR(TmpStr, p_Separator, 1, p_Index - 1);
end if;

P2 := INSTR(TmpStr, p_Separator, 1, p_Index);
return LTRIM(RTRIM(SUBSTR(TmpStr, P1 + 1, P2 - P1 - 1)));
exception
when others then
return NULL;
end GetSubStr;
begin
I := 1;
loop
v_Name := GetSubStr(:New.SendTo, I);
exit when v_Name is null;
insert into Table1(UserID, ID) values(v_Name, 生成你的ID);
end loop;
end Test;
 
后退
顶部