ALTER PROCEDURE dbo.sell
@pagesize int=5
@page
AS
exec('select top'+' '+cast(@pagesize*@page as varchar)+' '+'* from [wupin] order by id')
--exec('select top'+' '+str(@pagesize*@page)+' '+'* from [wupin] order by id')//这句也不行
请问下,这两句错在哪里了?

解决方案 »

  1.   

    动态sql语句基本语法 
    1 :普通SQL语句可以用Exec执行 eg:   Select * from tableName 
             Exec('select * from tableName') 
             Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg:   
    declare @fname varchar(20) 
    set @fname = 'FiledName' 
    Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
    Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可 
    declare @fname varchar(20) 
    set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功 
    exec sp_executesql @s   -- 此句会报错 declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功     
    exec sp_executesql @s   -- 此句正确 3. 输出参数 
    declare @num int, 
            @sqls nvarchar(4000) 
    set @sqls='select count(*) from tableName' 
    exec(@sqls) 
    --如何将exec执行结果放入变量中? declare @num int, 
                   @sqls nvarchar(4000) 
    set @sqls='select @a=count(*) from tableName ' 
    exec sp_executesql @sqls,N'@a int output',@num output 
    select @num 
      

  2.   

    在存储过程里把结果放到一表里,然后select这个表.ALTER   PROCEDURE   dbo.sell 
    @pagesize   int=5 
    @page 
    AS 
    exec( 'select top ' + cast(@pagesize*@page as varchar)+ ' * into tmp from [wupin] order by id') 
      

  3.   

    ALTER   PROCEDURE   dbo.sell 
    @pagesize   int=5,
    @page  int
    AS 
    exec( 'select top ' + cast(@pagesize*@page as varchar)+ ' * into tmp from [wupin] order by id')
    还是不行,提示cast附近有错误。
      

  4.   

    ALTER   PROCEDURE   dbo.sell 
    @pagesize   int=5 
    @page int = 1
    AS 
    exec( 'select top ' + cast(@pagesize*@page as varchar)+ ' * into tmp from [wupin] order by id') 
      

  5.   


    ALTER   PROCEDURE   dbo.sell 
    @pagesize   int=5 ,
    @page int = 1
    AS 
    exec( 'select top ' + cast(@pagesize*@page as varchar)+ ' * into tmp from [wupin] order by id')
    服务器: 消息 170,级别 15,状态 1,过程 sell1,行 5
    第 5 行: 'cast' 附近有语法错误。
      

  6.   

    ALTER   PROCEDURE   dbo.sell 
    @pagesize   int=5,
    @page int
    AS
    --set nocount on
    declare @pageall int,@pageallchar varchar(200)
    set @pageall=@pagesize*@page
    set @Pageallchar=cast(@pageall as varchar)exec( 'select   top '+ '   '+@Pageallchar+ '   '+ '*   from   [wupin]   order   by   id ') 
    --set nocount off
    Go
    --不知道这个对楼主有没有帮助
      

  7.   


    ALTER       PROCEDURE       dbo.sell   
    @pagesize       int=5, 
    @page   int 
    AS 
    --set   nocount   on 
    declare   @pageall   int,@pageallchar   varchar(200) 
    set   @pageall=@pagesize*@page 
    set   @Pageallchar=cast(@pageall   as   varchar) exec(   'select       top   '+   '       '+@Pageallchar+   '       '+   '*       from       [wupin]       order       by       id   ')   
    --set   nocount   off 
    Go 
    --不知道这个对楼主有没有帮助
    --------------------
    这个能运行。
    可是直接这样写exec('select top'+ '  '+cast(@pagesize*@page  as  varchar)+' '+'* from[wupin] order by id ')在哪出错? 
      

  8.   

    ALTER   PROCEDURE   dbo.sell 
    @pagesize   int=5,
    @page INT
    AS 
    exec( 'select   top '+ '   '+'cast('+@pagesize+'*'+@page+'   as   varchar)'+ '   '+ '*   from   [wupin]   order   by   id ') 
    这个应该可以
      

  9.   

    问题解决
    exec('select top'+' '+'cast('+@pagesize+'* '+@page+‘ as varchar) '+’ '+'* from [wupin] order by       id')   这样可以。
    3q
      

  10.   

    先谢谢
    还有错。
    继续问:
    ALTER               PROCEDURE               dbo.sell       
    @pagesize               int=5,   
    @page       int   
    AS   
    --set       nocount       on   
    declare       @pageall       int,@pageallchar       varchar(200)   
    set       @pageall=@pagesize*@page   
    set       @Pageallchar=cast(@pageall       as       varchar)   exec(       'select               top       '+       '               '+@Pageallchar+       '               '+       '*               from               [wupin]               order               by               id       ')       
    --set       nocount       off   
    Go   
    --不知道这个对楼主有没有帮助 
    -------------------- 
    这个能运行。 
    可是直接这样写exec( 'select   top '+   '     '+cast(@pagesize*@page     as     varchar)+ '   '+ '*   from[wupin]   order   by   id   ')在哪出错? 
      

  11.   

    不应该是变量需要为独立字段,在一些存储过程分页中就有'+CAST(@pagesize*(@page-1)   AS   varchar)+'这样的写法
      

  12.   

    问题是:
    在exec子句当中不能包含变量运算表达式,如果其中存在变量运算表达式的操作的操作,需先进入字符串拼接的方式把其表达达的值先计算出来方能使用 
    是csdn上的高手帮解决的。
    3q