存储过程里有这样的操作,根据表A的ID(一个ID只有一条记录),找到表A的部分资料,写入到表B里面。
在表B每增加一条记录的时候,会通过一个自定义函数来生成一个业务号,作为表B的ID。每一条表B写入完成后,要把这个序列号写入表A的相关字段里。
如果传入的一个ID,那么自然好处理。
如果传入的是ID列表(也就是多个ID),那么是不是只能用游标来一条一条得生成表B的ID,写入表B,回写表A?
有没有好的办法,也能批量一次性处理?
------解决方案--------------------
用函数把ID拆成行,然后IN或者join
--1.函数
if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')
drop function dbo.f_splitSTR
go
create function dbo.f_splitSTR
(
@s varchar(8000), --要分拆的字符串
@split varchar(10) --分隔字符
)
returns @re table( --要返回的临时表
col varchar(1000) --临时表中的列
)
as
begin
declare @len int
set @len = LEN(@split) --分隔符不一定就是一个字符,可能是2个字符
while CHARINDEX(@split,@s) >0
begin
insert into @re
values(left(@s,charindex(@split,@s) - 1))
set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'') --覆盖:字符串以及分隔符
end
insert into @re values(@s)
return --返回临时表
end
go
declare @res varchar(100)
set @res='1 2 3 4 5';
set @res = REPLACE(@res,' ',',')
select * from dbo.f_splitSTR(@res,',') t
/*
col
1
2
3
4
5
*/
------解决方案--------------------
字符串拆分有N种方法 也可以用REPLACE(@S,',',UNION ALL‘)这样来拼凑。