我在写一个程序,在一个记录集中让用户随意选择几条记录(比如选择了ID=20,25,26,27),然后在用户点击按扭后删除这几行,该过程在客户端很容易实现,只要执行“delect table1 where ID IN (20,25,26,27)”即可,可是这样必须给该客户删除数据的权限,这对数据库的安全是个隐患,我想用存储过程来实现此功能,程序大体如下: CREATE PROCEDURE delete_recs  
@jlj varchar(8000) 
as 
delete table1 where id in @jlj 
select @@row_count 
return(0) 但是我在执行delete_recs  '20,25,26,27 '时出现错误,提示varchar 到bigint 转换错误。我分析ID 是BIGINT 而@jlj是字符串的原因。可是该过程该如何实现呢?另外当用户选择了较多记录时该怎么办呢?如选择了全选,有几十万的记录,这将导致@jlj不够长,必须多次执行此过程,大家有什么好办法吗,我目前使用临时表将要删除的记录的id 用inert 语句保存在临时表中,然后调用存储过程,用delete 删除,此方法感觉比较笨拙。

解决方案 »

  1.   

    CREATE PROCEDURE delete_recs
    @jlj varchar(8000)
    as
       declare @sql varchar(8000)
       set @sql = 'delete table1 where id in' + @jlj
       exec (@sql)
       select @@row_count
      

  2.   

    CREATE PROCEDURE delete_recs
    @jlj varchar(8000)
    as
       declare @sql varchar(8000)
       set @sql =  'delete table1 where id in ' + @jlj
       exec (@sql)
       select @@rowcount 
      

  3.   

    如果用户要全选, 建议增加一个变量, 用来处理全选时候的情形, 并考虑用户用户全选后剔除少量, 这些都应该在你的程序里考虑好, 确保那个LIST不超过限制(或者是要保留的, 或者是要删除的)
      

  4.   

    谢谢帮助,该存储过程这样写应该不成问题。
    那么对于全选后剔除部分,我考虑还是我采用的老办法可能会比较好,既把要删除的数据ID用insert语句保存在临时表中,然后调用存储过程删除比较好,因为如果用每个id 为9位,加上逗号,共10位,varchar最大长度为8000,也就是说调用存储过程,最多每次能处理8000/10=800条记录,如果记录较多如10万条左右,无疑将调用100000/800=100次,如果将所有删除记录的循环过程写在一个事物中,并且用in 语句选择数据,无疑将划很长时间(估计>几分种)。至于采用保留的数据的方法,其实在数据库中所删除的只是符合一定条件的记录集,再经过客户手工选择的数据,只占很小的一部分,因此保留的方法可能也行不通。我用的老办法在insert 10万条记录的过程也很长,要考虑超时连接的问题,真不知道该如何解决。
      

  5.   

        呵呵是这样,    该公司每天要销售许多商品,我想在每月有一次结帐的功能,主要是想将当月的销售单转移的历史库中,但是由于有些货款不到位等情况,并不是当月的所有销售单都要上帐(有些货可能没有提等),这就要用户自己决定那些销售单要上帐,一般来说大多数要上而小部分不上,用户当然会选全选,然后再除掉不上帐的部分。分页的方法在记录少时还可以,要记录多的话,一页一页的操作也很麻烦。    我试了一下,在临时库中创建要转移的数据ID(178900条记录)就用了近15秒时间,将19万条记录(下有40万条销售明细记录)的删除工作就用了两分钟,还不包括复制到历史库的时间,估计的还得4分钟左右(接近6分钟客户还以为死机了),真让人难以承受,,呵呵当然服务器配置较低,c1.6 /1G/40G低速硬盘,我可不想让你们说去换硬件,其实数据库设计不好,用core 2的处理器也不会有什么好结果。我分析原因是在转移数据库的过程中使用了delete语句,产生了180M左右的日志文件,要转移的数据只是其中一个部门要结算的数据,不能用创建新表,将不转移的数据复制到新表,再将要转移的数据删除的办法。真是头痛.......
      

  6.   

    删除少量数据和保留少量数据的操作是完全不一样的操作。删除少量数据直接用DELETE,而保留少量数据则先把少量数据放进一个临时表中,然后TRUNCATE那个大表,再把少量数据COPY BACK, 然后删除临时表。
      

  7.   

    ---------------------------------------只保留五条数据
    select top(5) * 
    into #temp from copy
    truncate table --copy高速删除上亿条
    --删除及条件
    insert copy  select * from #temp
      

  8.   

    你们说的不错,但是我说了,每个部门结帐时只是删除或转移本部门的数据,在数据表中存的是多个部门的数据,一个部门的数据结帐时只删除本部门的数据,在数据表中并不是大多数。所以用truncate  不行阿,问题是删除数据有没有快一点的办法,每月结帐要近十分钟时间,是不是太长了些,才转移了不到20万条销售记录啊,怎么这么慢,是否是产生了大量的日志的引发的问题?,希望有操作过这样的朋友给点经验?