方法一
CREATE PROC D_t_Base_Employee @str varchar(100)
as
declare @sql varchar(1000)
set @sql='DELETE Employee WHERE ID IN ('+@str+')'
exec (@sql)
go
方法二
CREATE PROC D_t_Base_Employee @str varchar(100)
as
DELETE Employee WHERE CHARINDEX(','+CAST(id as varchar)+',',','+@str+',')>0
go
CREATE PROC D_t_Base_Employee @str varchar(100)
as
declare @sql varchar(1000)
set @sql='DELETE Employee WHERE ID IN ('+@str+')'
exec (@sql)
go
方法二
CREATE PROC D_t_Base_Employee @str varchar(100)
as
DELETE Employee WHERE CHARINDEX(','+CAST(id as varchar)+',',','+@str+',')>0
go
可是ID很多,比如有个树状菜单,勾选了很多ID, 1000个字符,甚至3000个字符都没法满足怎么办
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
*/
然后你可以:
select a.*
from a inner join 函数所生成的表 on a.xx=b.xx这样就可以筛选出a表中这些ID的数据
1. 字符串分离方法,性能一般,cpu消耗稍微高一些,适合数量少的时候,生成出记录统计信息总是一行
2.CLR方法,性能比较好,记录数特别多的时候和少的时候都不错,实际测试的时候cpu消耗的read都很少,但duration比较高,而且重复多次执行也不会降下来,可能是启动clr方法或者释放资源的时候占用的时间。
3.自定义表变量的方法,和表变量差不多,生成表变量的时候会产生一些write
4.xml 方法,性能可以接受,cpu消耗和read都不是很高,延迟小,统计信息和真实的有点差距,一般比实际的多,不知道是用什么东西评估的,如果调用的程序知道条目数的话 可以用 select top (@count)的方法给编译器一些提示,生成的执行计划比较接近实际.