方法一
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

解决方案 »

  1.   


    可是ID很多,比如有个树状菜单,勾选了很多ID, 1000个字符,甚至3000个字符都没法满足怎么办
      

  2.   

    建议通过一个函数把ID生成成一个表的格式再in或者join,过多的ID会引发性能问题
      

  3.   

    这是例子:--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
    */
    然后你可以:
    select a.*
    from a inner join 函数所生成的表 on a.xx=b.xx这样就可以筛选出a表中这些ID的数据
      

  4.   

    变量表当参数传递需要SQL2005以上版本
      

  5.   

    这几天做项目的时候试过很多方法
    1. 字符串分离方法,性能一般,cpu消耗稍微高一些,适合数量少的时候,生成出记录统计信息总是一行
    2.CLR方法,性能比较好,记录数特别多的时候和少的时候都不错,实际测试的时候cpu消耗的read都很少,但duration比较高,而且重复多次执行也不会降下来,可能是启动clr方法或者释放资源的时候占用的时间。
    3.自定义表变量的方法,和表变量差不多,生成表变量的时候会产生一些write
    4.xml 方法,性能可以接受,cpu消耗和read都不是很高,延迟小,统计信息和真实的有点差距,一般比实际的多,不知道是用什么东西评估的,如果调用的程序知道条目数的话 可以用 select top (@count)的方法给编译器一些提示,生成的执行计划比较接近实际.