日期:2014-05-18  浏览次数:20366 次

如何设计该存储过程?
我在写一个程序,在一个记录集中让用户随意选择几条记录(比如选择了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 删除,此方法感觉比较笨拙。

------解决方案--------------------
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


------解决方案--------------------
考虑是大量的数据在操作的时候应该换一种方式进行。
比如说分页,筛选,之后在做删除操作。这样数据量就不大了。不然一次性操作大数据会导致系统变慢,另外用户一次我想也照顾不来这么多数据吧?

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