我的存储过程
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[ceekay]@TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名@PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空@Fields VARCHAR(200), --要取出的字段,可以是多个表的字段,可以为空,为空表示select *@PageSize INT, --每页记录数@CurrentPage INT, --当前页,0表示第1页@Filter VARCHAR(200) = '', --条件,可以为空,不用填 where@Group VARCHAR(200) = '', --分组依据,可以为空,不用填 group by@Order VARCHAR(200) = '' --排序,可以为空,为空默认按主键升序排列,不用填 order byASBEGINDECLARE @SortColumn VARCHAR(200)DECLARE @Operator CHAR(2)DECLARE @SortTable VARCHAR(200)DECLARE @SortName VARCHAR(200)IF @Fields = ''SET @Fields = '*'IF @Filter = ''SET @Filter = 'WHERE 1=1'ELSESET @Filter = 'WHERE ' + @FilterIF @Group <>''SET @Group = 'GROUP BY ' + @GroupIF @Order <> ''BEGINDECLARE @pos1 INT, @pos2 INTSET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')IF CHARINDEX(' DESC', @Order) > 0IF CHARINDEX(' ASC', @Order) > 0BEGINIF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)SET @Operator = '<='ELSESET @Operator = '>='ENDELSESET @Operator = '<='ELSESET @Operator = '>='SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')SET @pos1 = CHARINDEX(',', @SortColumn)IF @pos1 > 0SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)SET @pos2 = CHARINDEX('.', @SortColumn)IF @pos2 > 0BEGINSET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)IF @pos1 > 0SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)ELSESET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)ENDELSEBEGINSET @SortTable = @TableNamesSET @SortName = @SortColumnENDENDELSEBEGINSET @SortColumn = @PrimaryKeySET @SortTable = @TableNamesSET @SortName = @SortColumnSET @Order = @SortColumnSET @Operator = '>='ENDDECLARE @type varchar(50)DECLARE @prec intSELECT @type=t.name, @prec=c.precFROM sysobjects oJOIN syscolumns c on o.id=c.idJOIN systypes t on c.xusertype=t.xusertypeWHERE o.name = @SortTable AND c.name = @SortNameIF CHARINDEX('char', @type) > 0SET @type = @type + '(' + CAST(@prec AS varchar) + ')'DECLARE @TopRows INTSET @TopRows = @PageSize * @CurrentPage + 1print @TopRowsprint @OperatorEXEC('DECLARE @SortColumnBegin ' + @type + 'SET ROWCOUNT ' + @TopRows + 'SELECT @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + 'SET ROWCOUNT ' + @PageSize + 'SELECT ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + '')END
调用如下USE [DataBase]
GODECLARE @return_value intEXEC @return_value = [dbo].[ceekay]
@TableNames = N'TB_User join TB_UserInfo on TB_User.u_Id= TB_UserInfo.u_Uid join TB_Supply on TB_UserInfo.u_Uid=TB_Supply.s_Uid ',
@PrimaryKey = N'TB_Supply.s_Id',
@Fields = N'TB_User.u_Id,TB_User.u_State,TB_User.u_State2,TB_User.u_Type,TB_UserInfo.u_Id,TB_UserInfo.u_UserName,TB_UserInfo.u_Uid,TB_UserInfo.u_Province,TB_UserInfo.u_City,TB_Supply.s_Id,TB_Supply.s_Title,TB_Supply.s_Content,TB_Supply.s_Slt,TB_Supply.s_Iid1 ',
@PageSize = 30,
@CurrentPage = 1,
@Filter = N's_Iid1=809',
@Order = N's_Order desc,s_Hits desc'SELECT 'Return Value' = @return_valueGO错误
31
<=
消息 156,级别 15,状态 1,第 5 行
关键字 'SET' 附近有语法错误。
消息 137,级别 15,状态 1,第 7 行
必须声明标量变量 "@SortColumnBegin"。
消息 137,级别 15,状态 2,第 11 行
必须声明标量变量 "@SortColumnBegin"。(1 行受影响)

解决方案 »

  1.   

    存储过程最后的EXEC改成PRINTR看看生成的sql串是什么.
      

  2.   

    print (' DECLARE @SortColumnBegin ' + @type + ' SET ROWCOUNT ' + @TopRows + ' SELECT @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + ' SET ROWCOUNT ' + @PageSize + ' SELECT ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + ' ')  看看这个是什么?
      

  3.   

    我真的够菜的,我按上面的改成print,为什么没输出sql语句呢?
      

  4.   

    很明显的错误,@SortColumnBegin 在存储过程中没有进行定义变量!
      

  5.   

    这个分页感觉是你同事网上找,因为这个分页在网上有许多介绍。查看这个帖子
    http://blog.csdn.net/lxy_abcde1190/archive/2008/04/18/2303333.aspx
    http://www.cnblogs.com/cn5135/articles/356819.html
      

  6.   

    既然樓主同事用了沒問題,說明存儲過程沒問題。。檢查一下調用,看看傳遞的參數有沒有問題:
    --调用如下 USE [DataBase] 
    GO DECLARE @return_value int EXEC @return_value = [dbo].[ceekay] 
    @TableNames = N'TB_User join TB_UserInfo on TB_User.u_Id= TB_UserInfo.u_Uid join TB_Supply on TB_UserInfo.u_Uid=TB_Supply.s_Uid ', 
    @PrimaryKey = N'TB_Supply.s_Id', 
    @Fields = N'TB_User.u_Id,TB_User.u_State,TB_User.u_State2,TB_User.u_Type,TB_UserInfo.u_Id,TB_UserInfo.u_UserName,TB_UserInfo.u_Uid,TB_UserInfo.u_Province,TB_UserInfo.u_City,TB_Supply.s_Id,TB_Supply.s_Title,TB_Supply.s_Content,TB_Supply.s_Slt,TB_Supply.s_Iid1 ', 
    @PageSize = 30, 
    @CurrentPage = 1, 
    @Filter = N's_Iid1=809', 
    @Order = N's_Order desc,s_Hits desc' SELECT 'Return Value' = @return_value GO 
      

  7.   

    too  looooooooogggggggggggggggg,学习