本帖最后由 吴步兵 于 2012-11-16 22:22 编辑
有如下业务:
需要批量删除数据,编号为主键,自动增长。我的解决方案是把选中的编号拼成字符串,然后传入数据库。利用存储过程处理。但SQL中好像没有数组类型。找了好多资料发现可以用CharIndex起到类似的作用。存储过程如下:- /*P_Delete 批量删除数据
- @TitleId_Array 批量数据编号组成的字符串。如:"1,2,3,4,5,6"
- @Table 要删除数据的表名
- @keyname 数据表的依据*/
- ALTER PROCEDURE [dbo].[P_Delete]
- @Id_Array varChar(max), --传入的字符串
- @Table varchar(50), --表名
- @keyname varchar(50) --删除依据
- AS
- BEGIN
- DECLARE @TID INT
- DECLARE @PointerPrev int
- DECLARE @PointerCurr int
- DECLARE @sqlstr varchar(max)
- Set @PointerPrev=1
- set @PointerCurr=1
- Set @PointerCurr=CharIndex(',',@Id_Array,@PointerPrev+1) -- 查找","在@Id_Array中位置,如果大于0则说明传人了多个ID
- if(@PointerCurr>0) --如果传人的是多个ID
- begin
- set @TId=cast(SUBSTRING(@Id_Array,@PointerPrev,@PointerCurr-@PointerPrev) as int)
- set @sqlstr = 'delete from ' + @Table + ' where ' + @keyname + '=' + cast(@TId as varchar(10))
- --select @sqlstr
- EXEC (@sqlstr)--删除第一条数据
- SET @PointerPrev = @PointerCurr
- while (@PointerPrev+1 < LEN(@Id_Array))
- Begin
- Set @PointerCurr=CharIndex(',',@Id_Array,@PointerPrev+1)
- if(@PointerCurr> 0)
- Begin
- set @TId=cast(SUBSTRING(@Id_Array,@PointerPrev+1,@PointerCurr-@PointerPrev-1) as int)
- set @sqlstr = 'delete from ' + @Table + ' where ' + @keyname + '=' + cast(@TId as varchar(10)) --拼接SQL语句
- EXEC (@sqlstr) --删除除去头尾的所有数据
- --select @sqlstr
- SET @PointerPrev = @PointerCurr
- End
- else
- Break
- end
- set @TId=cast(SUBSTRING(@Id_Array,@PointerPrev+1,LEN(@Id_Array)-@PointerPrev) as int)
- set @sqlstr = 'delete from ' + @Table + ' where ' + @keyname + '=' + cast(@TId as varchar(10)) --拼接SQL语句
- --select @sqlstr
- EXEC (@sqlstr) --删除尾数据
- end
- else ---传入的为单个ID
- begin
- set @sqlstr = 'delete from ' + @Table + ' where ' + @keyname + '=' + cast(@Id_Array as varchar(max)) --拼接SQL语句
- --select @sqlstr
- EXEC (@sqlstr)
- end
- end
复制代码 功能上能够实现要求,但老大看了以后说存储过程有问题。由于以前都是只写写简单的SQL语句,现在实在是晕了。求达人指点怎么优化。
|