A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴步兵 中级黑马   /  2012-11-9 16:50  /  1738 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴步兵 于 2012-11-16 22:22 编辑

有如下业务: 需要批量删除数据,编号为主键,自动增长。我的解决方案是把选中的编号拼成字符串,然后传入数据库。利用存储过程处理。但SQL中好像没有数组类型。找了好多资料发现可以用CharIndex起到类似的作用。存储过程如下:
  1. /*P_Delete 批量删除数据
  2. @TitleId_Array 批量数据编号组成的字符串。如:"1,2,3,4,5,6"
  3. @Table 要删除数据的表名
  4. @keyname 数据表的依据*/
  5. ALTER PROCEDURE [dbo].[P_Delete]
  6.           @Id_Array varChar(max), --传入的字符串
  7.           @Table varchar(50), --表名
  8.           @keyname varchar(50) --删除依据

  9. AS
  10. BEGIN
  11.           DECLARE @TID INT
  12.           DECLARE @PointerPrev int
  13.           DECLARE @PointerCurr int
  14.           DECLARE @sqlstr varchar(max)

  15.           Set @PointerPrev=1
  16.           set @PointerCurr=1

  17.          Set @PointerCurr=CharIndex(',',@Id_Array,@PointerPrev+1) -- 查找","在@Id_Array中位置,如果大于0则说明传人了多个ID
  18.         if(@PointerCurr>0) --如果传人的是多个ID
  19.             begin
  20.                 set @TId=cast(SUBSTRING(@Id_Array,@PointerPrev,@PointerCurr-@PointerPrev) as int)
  21.                 set @sqlstr = 'delete from ' + @Table + ' where ' + @keyname + '=' + cast(@TId as varchar(10))
  22.                --select @sqlstr
  23.               EXEC (@sqlstr)--删除第一条数据


  24.              SET @PointerPrev = @PointerCurr
  25.             while (@PointerPrev+1 < LEN(@Id_Array))
  26.                   Begin
  27.                        Set @PointerCurr=CharIndex(',',@Id_Array,@PointerPrev+1)
  28.                        if(@PointerCurr> 0)
  29.                               Begin
  30.                                        set @TId=cast(SUBSTRING(@Id_Array,@PointerPrev+1,@PointerCurr-@PointerPrev-1) as int)
  31.                                        set @sqlstr = 'delete from ' + @Table + ' where ' + @keyname + '=' + cast(@TId as varchar(10)) --拼接SQL语句
  32.                                        EXEC (@sqlstr) --删除除去头尾的所有数据
  33.                                        --select @sqlstr
  34.                                      SET @PointerPrev = @PointerCurr
  35.                            End
  36.                      else
  37.                         Break
  38.               end

  39.              set @TId=cast(SUBSTRING(@Id_Array,@PointerPrev+1,LEN(@Id_Array)-@PointerPrev) as int)
  40.              set @sqlstr = 'delete from ' + @Table + ' where ' + @keyname + '=' + cast(@TId as varchar(10)) --拼接SQL语句
  41.              --select @sqlstr
  42.              EXEC (@sqlstr) --删除尾数据
  43.      end
  44. else ---传入的为单个ID
  45.         begin
  46.                set @sqlstr = 'delete from ' + @Table + ' where ' + @keyname + '=' + cast(@Id_Array as varchar(max)) --拼接SQL语句
  47.               --select @sqlstr
  48.              EXEC (@sqlstr)
  49.         end
  50. end
复制代码
功能上能够实现要求,但老大看了以后说存储过程有问题。由于以前都是只写写简单的SQL语句,现在实在是晕了。求达人指点怎么优化。

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

2 个回复

倒序浏览
做批量删除的时候拼接字符串

create proc p_daleteuserinfo  //存储过程名
@username nvarchar(1000)
as
       
        if @username<>'' //判断是否为空以防报错
        begin
           declare @sql varchar(500)   //定义字符串变量
           set @sql= 'delete from UserInfo where '+@username    //把传过来的字符串和变量拼起来
           exec(@sql)  ////最后执行变量
       
        end
GO
回复 使用道具 举报
这是用的Sql语句的存储过程吧,在看传智.net 2011版的时候学了一些,就像写VB一样,看了一下,不太理解,学习中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马