首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

存储过程翻页有关问题

2012-09-19 
存储过程翻页问题在关键字 like 附近有语法错误。 SELECT TOP 20 PID,Pbrand,Pnamecn FROM ProductList W

存储过程翻页问题
在关键字 'like' 附近有语法错误。 SELECT TOP 20 PID,Pbrand,Pnamecn FROM ProductList WHERE Pbrand like '%88%' ORDER BY PID DESC

问题:一直报错"在关键字 'like' 附近有语法错误",上面的语句是我把存储过程里的执行语句的输出,检查感觉没问题,然后拿到"sql 查询分析器"里执行也可以查询出数据,但就不知道为什么还是会一直报"在关键字 'like' 附近有语法错误"
数据库sql2000

 

翻页的存储过程代码是:

C# code
CREATE PROCEDURE [SelectByPage]  @pageSize int = 20,                                --分页大小  @currentPage int ,                                 --第几页  @columns varchar(1000) = '*',                      --需要得到的字段  @tableName varchar(100),                           --需要查询的表     @condition varchar(1000) = '',                     --查询条件, 不用加where关键字  @ascColumn varchar(100) = '',                      --排序的字段名 (即 order by column asc/desc)  @bitOrderType bit = 0,                             --排序的类型 (0为升序,1为降序)  @pkColumn varchar(50) = '',                        --主键名称  @TotalCount INT output  -- 总记录数ASBEGIN                                                --存储过程开始  DECLARE @strTemp varchar(300)  DECLARE @strSql varchar(5000)                      --该存储过程最后执行的语句  DECLARE @strOrderType varchar(1000)                --排序类型语句 (order by column asc或者order by column desc)  DECLARE @CountSql NVARCHAR(4000)print ''    IF @condition !=''    BEGIN   SET @CountSql = 'SELECT @CountOUT=COUNT(*) FROM ' + @tableName + 'WHERE ' + @condition ; -- 拼接获取总记录数的 @CountSql 语句    endelseBEGINSET @CountSql = 'SELECT @CountOUT=COUNT(*) FROM ' + @tableName + @condition ; -- 拼接获取总记录数的 @CountSql 语句end  EXEC SP_EXECUTESQL @CountSql, N'@CountOUT INT OUT', @CountOUT = @TotalCount OUT; -- 获取总记录数  BEGIN   IF @bitOrderType = 1                --降序      BEGIN        SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC'        SET @strTemp = '<(SELECT min'      END    ELSE                  --升序      BEGIN        SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC'        SET @strTemp = '>(SELECT max'      END    IF @currentPage = 1            --第一页      BEGIN        IF @condition != ''          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+            ' WHERE '+@condition+@strOrderType        ELSE          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+@strOrderType      END    ELSE                  -- **页      BEGIN        IF @condition !=''          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+          ' WHERE '+@condition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+          ' '+@pkColumn+' FROM '+@tableName + ' where '+@condition+@strOrderType+') AS TabTemp)'+@strOrderType        ELSE          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+          ' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+' '+@pkColumn+          ' FROM '+@tableName+@strOrderType+') AS TabTemp)'+@strOrderType      END  END  print @strSql  EXEC (@strSql)ENDGO




[解决办法]
你调试下你的存储过程,或者将@CountSql PRINT出来看看。
你这样问没人知道什么原因,因为你@CONDITION是什么样的都不知道

而且你这样动态执行SQL语句的安全隐患很大。
[解决办法]
知道了
SQL code
CREATE PROCEDURE [SelectByPage]  @pageSize int = 20,                                --分页大小  @currentPage int ,                                 --第几页  @columns varchar(1000) = '*',                      --需要得到的字段  @tableName varchar(100),                           --需要查询的表     @condition varchar(1000) = '',                     --查询条件, 不用加where关键字  @ascColumn varchar(100) = '',                      --排序的字段名 (即 order by column asc/desc)  @bitOrderType bit = 0,                             --排序的类型 (0为升序,1为降序)  @pkColumn varchar(50) = '',                        --主键名称  @TotalCount INT output  -- 总记录数ASBEGIN                                                --存储过程开始  DECLARE @strTemp varchar(300)  DECLARE @strSql varchar(5000)                      --该存储过程最后执行的语句  DECLARE @strOrderType varchar(1000)                --排序类型语句 (order by column asc或者order by column desc)  DECLARE @CountSql NVARCHAR(4000)print ''    IF @condition !=''    BEGIN   SET @CountSql = 'SELECT @CountOUT=COUNT(*) FROM ' + @tableName + ' WHERE ' + @condition ; -- 拼接获取总记录数的 @CountSql 语句    endelseBEGINSET @CountSql = 'SELECT @CountOUT=COUNT(*) FROM ' + @tableName + @condition ; -- 拼接获取总记录数的 @CountSql 语句end  EXEC SP_EXECUTESQL @CountSql, N'@CountOUT INT OUT', @CountOUT = @TotalCount OUT; -- 获取总记录数  BEGIN   IF @bitOrderType = 1                --降序      BEGIN        SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC'        SET @strTemp = '<(SELECT min'      END    ELSE                  --升序      BEGIN        SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC'        SET @strTemp = '>(SELECT max'      END    IF @currentPage = 1            --第一页      BEGIN        IF @condition != ''          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+            ' WHERE '+@condition+@strOrderType        ELSE          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+@strOrderType      END    ELSE                  -- **页      BEGIN        IF @condition !=''          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+          ' WHERE '+@condition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+          ' '+@pkColumn+' FROM '+@tableName + ' where '+@condition+@strOrderType+') AS TabTemp)'+@strOrderType        ELSE          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+          ' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+' '+@pkColumn+          ' FROM '+@tableName+@strOrderType+') AS TabTemp)'+@strOrderType      END  END  print @strSql  EXEC (@strSql)ENDGO 


[解决办法]
主要是

SQL code
  SET @CountSql = 'SELECT @CountOUT=COUNT(*) FROM ' + @tableName + ' WHERE ' + @condition ; -- 拼接获取总记录数的 @CountSql 语句 

热点排行