注册 登录
编程论坛 VB.NET论坛

关于在SQL中查询第N条记录

梦幻倩影 发布于 2016-09-13 21:24, 2520 次点击
declare @n int
 set @n=5
 drop table #temp
 select identity(int,1,1) as id,* into #temp from cpkhdm1 ;
 select * from #temp where id between @n and @n

上面两条语句可以,但想改成一条语句却出错:
 select top 1 [款号],[图片],[myId] from [dqgl2016].[dbo].[cpkhdm1] where [myid] not in (select top @n [myid] from [dqgl2016].[dbo].[cpkhdm1])
好象不能用变量n,改为常数又可以,为什么
 select top 1 [款号],[图片],[myId] from [dqgl2016].[dbo].[cpkhdm1] where [myid] not in (select top 5 [myid] from [dqgl2016].[dbo].[cpkhdm1])
5 回复
#2
不说也罢2016-09-14 08:58
不知道楼主用的SQLSERVER是什么版本的
如果是2005以上的版本,这样:select top (@n) [myid] from [dqgl2016].[dbo].[cpkhdm1]
添加上面红色的小括号即可;

如果是2000版本,可能需要用convert转换,进行字符串拼接,然后EXEC @sql(拼接后的查询语句),我这暂时没有2000环境,你测试下
例如:
declare @n int,@strSql varchar(1000)
set @strSql='select top '+convert(varchar,@p)+' * from 表名'
exec @strSql

这个问题在SQLSERVER版块提问更好。毕竟这是版块。
#3
梦幻倩影2016-09-14 10:05
还是经验重要啊,昨晚自己弄了一晚上都搞不定 ,原来如此简单,在sql2008中只需加个( )

另外在sql2000中刚才测试了declare @n int,@strSql varchar(1000)
set @strSql='select top '+convert(varchar,@p)+' * from 表名'
exec @strSql
会出错,提示找不到存储过程@strSql
要改为exec (@strSql)才OK
#4
不说也罢2016-09-14 10:07
恭喜楼主!
#5
梦幻倩影2016-09-14 10:12
查询第N条记录 sql2008正确语句:
declare @n int
set @n=5
select top 1 [款号],[图片],[myId] from [dqgl2016].[dbo].[cpkhdm1] where [myid] not in (select top (@n-1) [myid] from [dqgl2016].[dbo].[cpkhdm1])
#6
梦幻倩影2016-09-14 16:51
定义了一个存储过程,然后,查 首记录,前一条,后一条,最后一条  只要控制改变参数 n(全局变量) 全搞定
CREATE PROCEDURE check1
@n int
AS
BEGIN
  SET NOCOUNT ON;
  declare @i int
 select @i =count(*) from cpkhdm1
    if @i<@n
       begin
         set  @n=@i
       end   
   select top 1 款号,图片,myId from dbo.cpkhdm1 where myid not in (select top (@n-1) myid from dbo.cpkhdm1);
   SET NOCOUNT Off;
 END

1