100分求如何实现查询到数据并删除?

faunaq 2009-09-14 09:30:55
我有一个100万条数据的库,想实现:查询前100条数据,并同时将这100条数据从库里删除。
这一过程中要防止这些数据被其他查询者获取,保证查询的数据唯一性。
在ASP里,我用游标方式查询后并循环删除可以实现,但是效率低下不说,还占用大量的服务器资源!

求教各位高手!给出例子,不知道用纯SQL或用储存过程是否可以实现。
...全文
171 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
faunaq 2009-09-15
  • 打赏
  • 举报
回复
to soft_wsx

单独执行
select top 100 * into #a from splsk(nolock)

delete from splsk with(xlock,paglock) where plh in(select top 100 plh from splsk(nolock))

都是成功影响100条数据

而且这样单独调用,原数据也成功删除了100条!

但是在调用储存过程时,却不起作用!
closefriends 2009-09-15
  • 打赏
  • 举报
回复

sql2000
guguda2008 2009-09-15
  • 打赏
  • 举报
回复
撤退,交给帮主
soft_wsx 2009-09-15
  • 打赏
  • 举报
回复
create proc dbo.tbaa
as
begin tran
select top 100 * into #a from splsk(nolock)
delete from splsk with(xlock,paglock) where plh in(select top 100 plh from splsk(nolock))
select * from #a
drop table #a

commit tran
go


exec dbo.tbaa
/*

(100 行受影响)

(100 行受影响)

(100 行受影响)
*/
表名你改了没有splsk是我数据库中的表!
faunaq 2009-09-15
  • 打赏
  • 举报
回复
to soft_wsx

会不会因为我是SQL2K的数据库,支持语句有问题??
faunaq 2009-09-15
  • 打赏
  • 举报
回复
to soft_wsx
当然改了!
代码改后:

create proc dbo.tba
as

BEGIN TRAN
SELECT TOP 100 * into #a FROM table1(nolock)
DELETE FROM table1 WITH (xlock, paglock) WHERE id IN(SELECT TOP 100 id FROM table1(nolock))
select * from #a
drop table #a

COMMIT TRAN
GO

soft_wsx 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 faunaq 的回复:]
to soft_wsx

SQL codecreateproc dbo.tbaasbegintranselecttop100*into #afrom splsk(nolock)deletefrom splskwith(xlock,paglock)where plhin(selecttop100 plhfrom splsk(nolock))select*from #adroptable #acommittrango

此过程测试了一下,不能删除原库中的数据!不知何故
[/Quote]只执行中间语句看一下!
select top 100 * into #a from splsk(nolock)
--select @@rowcount查询一下所影响的行数是多少
delete from splsk with(xlock,paglock) where plh in(select top 100 plh from splsk(nolock))
--select @@rowcount查询一下所影响的行数是多少
select * from #a
drop table #a
faunaq 2009-09-14
  • 打赏
  • 举报
回复
to soft_wsx


create proc dbo.tba
as
begin tran
select top 100 * into #a from splsk(nolock)
delete from splsk with(xlock,paglock) where plh in(select top 100 plh from splsk(nolock))
select * from #a
drop table #a

commit tran
go




此过程测试了一下,不能删除原库中的数据!不知何故
战斗生活 2009-09-14
  • 打赏
  • 举报
回复
[
Quote=引用 10 楼 soft_wsx 的回复:]
SQL codecreateproc dbo.tbaasselecttop100*into #afrom splskdeletefrom splskwhere plhin(selecttop100 plhfrom splsk)select*from #adroptable #adeclare@spnvarchar(100)set@sp=N'splsk'select*from@spgoexec db¡­
[/Quote]



顶这个吧 不过有点==
faunaq 2009-09-14
  • 打赏
  • 举报
回复
剪子哥的博客我看了,写的很好哦,不过我的是SQL SERVER 2K 不支持很多 TOP操作。

刚才忘记说了,我的数据库是 SQLSERVER 2000
guguda2008 2009-09-14
  • 打赏
  • 举报
回复
LZ你看没看剪子哥的回复啊
soft_wsx 2009-09-14
  • 打赏
  • 举报
回复
create proc dbo.tba
as
begin tran
select top 100 * into #a from splsk(nolock)
delete from splsk with(xlock,paglock) where plh in(select top 100 plh from splsk(nolock))
select * from #a
drop table #a

commit tran
go
楼主可以模拟一下!在CMD中调用批处理
soft_wsx 2009-09-14
  • 打赏
  • 举报
回复
这样啊!在表名后在with(xlock,paglock)

查询时使用nolock
faunaq 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 soft_wsx 的回复:]
SQL codecreateproc dbo.tbaasselecttop100*into #afrom splskdeletefrom splskwhere plhin(selecttop100 plhfrom splsk)select*from #adroptable #adeclare@spnvarchar(100)set@sp=N'splsk'select*from@spgoexec db¡­
[/Quote]

想问下,查询后,数据还有没有可能被其他人查询获取到?也就是说会不会来不及删除就被别人又获取到呢?因为服务器上同时有上万人下载查询数据
soft_wsx 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jinjazz 的回复:]
delete top(100)  from 你的表 output deleted.id, deleted.name...你要的字段

[/Quote]学习了!第一次看到!
soft_wsx 2009-09-14
  • 打赏
  • 举报
回复
create proc dbo.tba
as
select top 100 * into #a from splsk
delete from splsk where plh in(select top 100 plh from splsk)
select * from #a
drop table #a

declare @sp nvarchar(100)
set @sp=N'splsk'
select * from @sp
go



exec dbo.tba
用存储过程吧!
翼帆 2009-09-14
  • 打赏
  • 举报
回复


delete from tb where id in (select top 100 id from tb)

delete top(100) from tb -- where ... order by ...


guguda2008 2009-09-14
  • 打赏
  • 举报
回复
剪子哥的博客一定要找时间从头到尾读一遍
jinjazz 2009-09-14
  • 打赏
  • 举报
回复
详细参考

SQLServer2005的Top功能
http://blog.csdn.net/jinjazz/archive/2009/09/04/4520749.aspx
jinjazz 2009-09-14
  • 打赏
  • 举报
回复
delete top(100) from 你的表 output deleted.id, deleted.name...你要的字段
加载更多回复(5)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧