51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2909|回复: 1
打印 上一主题 下一主题

[转贴] 用一条SQL语句从SQLServer的表中取出指定的行数

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-8-16 15:40:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
条件:表格ABC,主键列为id int identity(1,1)

问题:从ABC中找出第m行至第n行的记录集(m<n)
在解答之前,先要弄清楚SQL的select语句中几个保留字(top,where,order)的执行顺序,
它们的执行顺序是 1.where 2.order 3.top 。弄清楚了这点,接下来就容易了。
解答一:
select top @n-@m+1 *
from ABC
where id not in (select top @m-1 id from ABC order by id)
order by id

解答二:
select A.* from
(select top @n-@m+1 B.*
  from (select top @n * from ABC order by id) AS B
  order by B.id desc) AS A
order by A.id
比较效率:解答二效率更高。
其他考虑:可以不限于主键列,可以针对任何一列排序。
根据上述两种解答,编写两个存储过程,输入参数为表名、列名、起始行号、终止行号。输出参数为整数,指示操作是否成功。存储过程返回一记录集。两存储过程在SQLServer2000上运行通过。
存储过程一:
CREATE PROCEDURE RetrieveRowsFromTable_A (
@ret  int output,
@Table nvarchar(64),
@Column nvarchar(64),
@m int,
@n int
)
AS
DECLARE @error_var int, @rowcount_var int,@identity_var int
declare @sql nvarchar(4000)
declare @params nvarchar(500)
if (@m>@n)
begin
  set @ret=-1
  return
end

set @sql=N'select top ' + str(@n-@m+1) + N' * '
set @sql=@sql + N' from ' + @Table
set @sql=@sql + N' where ' + @Column + N' not in (select top ' + str(@m-1) + N' ' + @Column + N' from ' + @Table + N' order by ' + @Column + N')'
set @sql=@sql + N' order by ' + @Column

set @params=N'@Table nvarchar(64),@Column nvarchar(64),@m int,@n int'
EXEC sp_executesql @sql,@params,@Table,@Column,@m,@n
SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT,@identity_var = @@IDENTITY
if (@error_var=0)
  set @ret=@rowcount_var
else
  set @ret=-1
GO


存储过程二:
CREATE PROCEDURE RetrieveRowsFromTable_B (
@ret  int output,
@Table nvarchar(64),
@Column nvarchar(64),
@m int,
@n int
)
AS
DECLARE @error_var int, @rowcount_var int,@identity_var int
declare @sql nvarchar(4000)
declare @params nvarchar(500)
if (@m>@n)
begin
  set @ret=-1
  return
end
set @sql=N'select A.* from'
set @sql=@sql + N' (select top ' + str(@n-@m+1) + N' B.*'
set @sql=@sql + N' from (select top ' + str(@n) + N' * from ' + @Table + N' order by ' + @Column + N') AS B'
set @sql=@sql + N' order by B.' + @Column + N' desc) AS A'
set @sql=@sql + N' order by A.' + @Column
set @params=N'@Table nvarchar(64),@Column nvarchar(64),@m int,@n int'
EXEC sp_executesql @sql,@params,@Table,@Column,@m,@n
SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT,@identity_var = @@IDENTITY
if (@error_var=0)
  set @ret=@rowcount_var
else
  set @ret=-1
GO


——End.



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=389587
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-8-16 16:02:09 | 只看该作者
在Sql Server查询分析器中首先执行set statistics io on,然后执行你要执行的语句。在“消息”中将显示各种IO。

就能看到Sql语句的执行效率。

[ 本帖最后由 shanxi 于 2007-8-16 16:11 编辑 ]
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-9-23 08:29 , Processed in 0.081514 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表