declare @vmcode varchar(50);
declare @i int;
set @i=1
select top 1 @vmcode=code from v_m
exec('select top 1 '+ @vmcode+'=code from v_m')
select top @i @vmcode=code from v_m
exec('select top '+ @i+ @vmcode +'=code from v_m')
exec('select top '+ @i+ '@vmcode=code from v_m')
这几天天天盯着数据看,一条条查繁琐,所以想写个批处理,把关键数据打印出来。上面的sql是简化的。我是想实现从一张表里通过循环分页一条记录一条记录查询出一个字段code。下面是大概sql,因为下班忘了拷哪些sql,笔记本上也没安装sql server
所以自己简单写了些,有些sql有误,勿怪啊,不过您可以看出我的大概意图的*_*
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE dbo.selectInfo
(
@date varchar(50)
)
AS
BEGIN
SET NOCOUNT ON;
declare @vmdate varchar(50);
declare @vmcode varchar(50);
declare @count int;
select @count=count(*) from v_m where date=@date
declare @i int;
set @i=1
--test
--1.exec( 'select top 1 '+@vmcode+'=code from v_m where date=''2011-08-30'' order by code asc')
--2.select top 1 @vmcode=code from v_m
--3.exec('select top 1 '+ @vmcode+'=code from v_m')
--4.select top @i @vmcode=code from v_m
--5.exec('select top '+ @i+ @vmcode +'=code from v_m')
--6.exec('select top '+ @i+ '@vmcode=code from v_m') while @i<=@count
begin
print @i
select @vmcode=code from 
( select top 1 * from ( select  top @i * from v_m order by code asc ) a order by code desc ) b order by code asc
print cast(varchar(10),@i) + '   ' +@vmcode;
set @i=@i+1
end END
GO注释掉的1-6 sql 测试用。第二条是可以的,其它都是不行的。
按理说第四条(select top @i @vmcode=code from v_m)应该行啊,怎么也不行啊。关键词top 不能和变量一起用?
其它几条为什么不行,如果大虾有时间也帮小弟解释解释哈。
很想结实这方面的大虾,我的QQ335146812,按常理不该泄漏的

解决方案 »

  1.   

        --1.exec( 'select top 1 '+@vmcode+'=code from v_m where date=''2011-08-30'' order by code asc')
    --这句不能用,因为 +@vmcode+'=...就把这个变量的值连接到字符串中了,其实你这个变量还没赋值,而且还是数值型的    --2.select top 1 @vmcode=code from v_m
        --3.exec('select top 1 '+ @vmcode+'=code from v_m')
    --这句与1同    --4.select top @i @vmcode=code from v_m
    --如果你用的是 2005,可以 top(@i),但注意,如果赋值的话,它只把最后查到的一个赋给变量,因此效率不高是一,而且你还应该加一个排序列
        --5.exec('select top '+ @i+ @vmcode +'=code from v_m')
    --这句不仅有4的错,还有1的错    --6.exec('select top '+ @i+ '@vmcode=code from v_m')
    --这句将变量引入到动态查询里了,这不是不可以,但不能用exec,而是要用SP_EXECUTESQL,将变量传入,查询后传出,但同样有4的毛病.
      

  2.   

    select top (@i) @vmcode=code from v_m order by ...
      

  3.   

    网上分页存储过程太多了,随便找个好好琢磨吧.你这样写实际上是没有意义的,存储过程表面上是"一条一条"找出数据给你的,但实际上,它不还是一下子运行完了,把所有数据都写给你了么,而且还多了一大堆的间隔,比如...条受影响..之类的,最后还不如
    select * from v_m order by ...
    更直接呢.
      

  4.   


        while @i<=@count
        begin
        print @i
        select @vmcode=code from 
        ( select top 1 * from ( select  top (@i) * from v_m where date=@date order by code asc ) a order by code desc ) b order by code asc
        print cast(varchar(10),@i) + '   ' +@vmcode;
        set @i=@i+1
        end 你看这样应该可以吧。电脑没安sql server明天试试。
      

  5.   

    这样就行了:
    select top 1 @vmcode=code from ( 
    select  top (@i) * from v_m order by code asc 
    ) a order by code desc 不需要再加一层.
      

  6.   


    不是的,如果是select * from v_m order by ...查询是一大堆数据,我想循环查出一个字段一个数据code,然后根据这个数据作为下个的sql的查询条件的
    如:select * from v_m where code=@vmcode and convert(nvarchar(10),firstTime,120)=@date and conventNum<=0.8,也就说查出那个数据是后续查询的基础。如果全部查询……那还怎么查具体的呀。T-SQL没有数组变量!!!!
      

  7.   

    不好意思 cast(varchar(10),@i)这个写错了是这样的额 cast(@i as varchar(10))