delimiter //
CREATE PROCEDURE dnt_getuserlist()
begin
declare pagesize int;
declare pageindex int;
declare orderby  varchar(200);
DECLARE pagetop int;
DECLARE `sql` varchar(1000);
SET pagetop = (pageindex-1)*pagesize;
IF pageindex = 1 then
SET `sql`= 'SELECT TOP ' + CAST(pagesize AS varchar(10)) + ' [dnt_users].[uid], 
FROM [dnt_users] LEFT JOIN [dnt_userfields] ON [dnt_userfields].[uid]   = [dnt_users].[uid] ' + orderby;
ELSE
SET `sql` = 'SELECT TOP ' + CAST(pagesize AS varchar(10)) + ' [dnt_users].[uid], [dnt_users].[username], [dnt_users].[nickname], [dnt_users].[joindate], [dnt_users].[credits], [dnt_users].[posts], [dnt_users].[email], [dnt_users].[lastactivity], [dnt_userfields].[location] FROM [dnt_users] LEFT JOIN [dnt_userfields] ON [dnt_userfields].[uid] = [dnt_users].[uid] WHERE [dnt_users].[uid] NOT IN (SELECT TOP ' + CAST(pagetop AS varchar(10)) + ' [uid] FROM [dnt_users]  ' + orderby + ') '+ replace(orderby,'WHERE','AND');
END IF;
select `sql`;
call `sql`;
end;//该存储过程在 CAST(pagesize AS varchar(10))附近报错,请问是哪里错了,mysql里不能这样写吗?

解决方案 »

  1.   

    mysql> delimiter //
    mysql> CREATE PROCEDURE dnt_getuserlist()
        -> begin
        -> declare pagesize int;
        -> declare pageindex int;
        -> declare orderby  varchar(200);
        -> DECLARE pagetop int;
        -> DECLARE `sql` varchar(1000);
        -> SET pagetop = (pageindex-1)*pagesize;
        -> IF pageindex = 1 then
        ->          SET `sql`= concat( 'SELECT TOP ' , pagesize , ' [dnt_users].[uid] FROM [dnt_users] LEFT JOIN [dnt_userfields] ON [dnt_userfields].[uid]   = [dnt_users].[uid] ' , orderby);
        -> ELSE
        ->          SET `sql` = concat('SELECT TOP ' , pagesize , ' [dnt_users].[uid], [dnt_users].[username], [dnt_users].[nickname], [dnt_users].[joindate], [dnt_users].[credits], [dnt_users].[posts], [dnt_users].[email], [dnt_users].[lastactivity], [dnt_userfields].[location] FROM [dnt_users] LEFT JOIN [dnt_userfields]ON [dnt_userfields].[uid] = [dnt_users].[uid] WHERE [dnt_users].[uid] NOT IN (SELECT TOP ' , pagesize , ' [uid] FROM [dnt_users]  ' , orderby , ') ', replace(orderby,'WHERE','AND'));
        -> END IF;
        -> select `sql`;
        ->   set @sSQL=`sql`;
        ->  PREPARE  stmt1 FROM   @sSQL;
        ->  EXECUTE stmt1 ;
        ->  DEALLOCATE PREPARE stmt1;
        ->
        -> end;//
    Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
    mysql>
      

  2.   

    1、MYSQL 中字符中相加不是用+号,而是CONCAT()
    2、MYSQL不需要做CAST,另外CAST函数的语法也和MS SQL SERVER也不同。
    3、MYSQL中动态执行SQL语句用的是PREPARE/EXECUTE具体语法说明你可以参考一下官方手册的说明和例子。MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html