首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

分页的存储过程在无符合查询条件时提示语法异常

2012-04-06 
分页的存储过程在无符合查询条件时提示语法错误?我有一个为查询结果分页的存储过程,在有符合查询条件的记

分页的存储过程在无符合查询条件时提示语法错误?
我有一个为查询结果分页的存储过程,在有符合查询条件的记录时,会正确返回所查询到的结果;但当数据库中没有符合条件的记录时,它就报错:
------------------------------------------
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '-' 附近有语法错误。
------------------------------------------
我弄不清这是什么原因,请大家帮帮忙看看。。。
(为了直观一点,我把这段存储过程稍作修改,变成一般的命令)

SQL code
declare  @TableName VARCHAR(200),     --表名    @FieldList VARCHAR(2000),    --显示列名    @PrimaryKey VARCHAR(100),    --单一主键或唯一值键    @Where VARCHAR(1000),        --查询条件 不含'where'字符    @Order VARCHAR(1000),        --排序 不含'order by'字符,如id asc,userid desc,当@SortType=3时生效    @SortType INT,               --排序规则 1:正序asc 2:倒序desc 3:多列排序    @RecorderCount INT,          --记录总数 0:会返回总记录    @PageSize INT,               --每页输出的记录数    @PageIndex INT,              --当前页数    @TotalCount INT, --OUTPUT,      --返回记录总数    @TotalPageCount INT --OUTPUT   --返回总页数select @TableName='[topic]', --VARCHAR(200),     --表名    @FieldList=' [id],tLock,tColor,tIsQualitified,tTitle,tTime,tUID,tUName,tReply,tReplyTime,tReplyUID,tReplyUName', --VARCHAR(2000),    --显示列名    @PrimaryKey='[id]', --VARCHAR(100),    --单一主键或唯一值键    @Where=' tSource=0 and (tCID=41 )', --VARCHAR(1000),        --查询条件 不含'where'字符    @Order='tPromotion DESC,tTop DESC', --VARCHAR(1000),        --排序 不含'order by'字符,如id asc,userid desc,当@SortType=3时生效    @SortType=3, --INT,               --排序规则 1:正序asc 2:倒序desc 3:多列排序    @RecorderCount=0, --INT,          --记录总数 0:会返回总记录    @PageSize=10, --INT,               --每页输出的记录数    @PageIndex=1 --INT,              --当前页数    --@TotalCount INT OUTPUT,      --返回记录总数    --@TotalPageCount INT OUTPUT --AS    SET NOCOUNT ON    IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''         OR ISNULL(@PrimaryKey,'') = ''        OR @SortType < 1 OR @SortType >3        OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0    BEGIN                RETURN    END     DECLARE @new_where1 VARCHAR(1000)    DECLARE @new_where2 VARCHAR(1000)    DECLARE @new_order VARCHAR(1000)       DECLARE @Sql VARCHAR(8000)    DECLARE @SqlCount NVARCHAR(4000)    IF ISNULL(@where,'') = ''        BEGIN            SET @new_where1 = ' '            SET @new_where2 = ' WHERE  '        END    ELSE        BEGIN            SET @new_where1 = ' WHERE ' + @where             SET @new_where2 = ' WHERE ' + @where + ' AND '        END    IF ISNULL(@order,'') = '' OR @SortType = 1  OR @SortType = 2         BEGIN            IF @SortType = 1 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' ASC'            IF @SortType = 2 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' DESC'        END    ELSE        BEGIN            SET @new_order = ' ORDER BY ' + @Order        END    SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'                    + CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1        IF @RecorderCount = 0        BEGIN             EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',                               @TotalCount OUTPUT,@TotalPageCount OUTPUT        END    ELSE        BEGIN             SELECT @TotalCount = @RecorderCount                    END    IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)        BEGIN            SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)        END    IF @PageIndex = 1        BEGIN            SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '                        + @TableName + @new_where1 + @new_order        END    ELSE        BEGIN            IF @SortType = 1                BEGIN                    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '                                + @TableName + @new_where2 + @PrimaryKey + ' > '                               + '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '                               + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey                                + ' FROM ' + @TableName                               + @new_where1 + @new_order +' ) AS TMP) '+ @new_order                END            IF @SortType = 2                BEGIN                    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '                                + @TableName + @new_where2 + @PrimaryKey + ' < '                               + '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '                               + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey                                +' FROM '+ @TableName                               + @new_where1 + @new_order + ') AS TMP) '+ @new_order                                               END                   IF @SortType = 3                BEGIN                    IF CHARINDEX(',',@Order) = 0 BEGIN RETURN END                    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '                               + @TableName + @new_where2 + @PrimaryKey + ' NOT IN (SELECT TOP '                               + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey                               + ' FROM ' + @TableName + @new_where1 + @new_order + ')'                               + @new_order                END        END    EXEC(@Sql) 



[解决办法]
你还是应该把原来的代码贴出来,还有就是错误提示
[解决办法]
把存储过程改一下:在最后执行@sql前,加上一句:print @sql
[解决办法]
探讨

引用:
你还是应该把原来的代码贴出来,还有就是错误提示


这个是原来的代码,和顶楼的区别只是最开头的赋值。
SQL code

CREATE PROC viewPage
/*
no_mIss 分页存储过程 2007.2.20 QQ:34813284
适用于单一主键或存在唯一值列的表或视图 ……

[解决办法]
在EXEC(@Sql)
之前加print(@sql)看看什么地方错了.
[解决办法]

IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)
BEGIN
SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)
--print @PageIndex
END


这一段你写错了 得到的是 @PageIndex 是0 

这样下面 STR(@PageSize*(@PageIndex-1)) 就变成 -10 了所以就出错了。

热点排行
Bad Request.