set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE  [dbo].[GetRecordFromPage]
 @tblName            varchar(255),                --   表名 
          @RetColumns         varchar(1000) = '*',         --   需要返回的列,默认为全部   
          @Orderfld           varchar(255),                --   排序字段名   
          @PageSize           int  =  10,                  --   页尺寸   
          @PageIndex          int  =  1,                   --   页码   
          @IsCount            bit  =  0,                   --   返回记录总数,   非   0   值则返回   
          @OrderType          varchar(50)  =  'asc',       --   设置排序类型,   非   asc   值则降序   
          @strWhere           varchar(1000)  =  ''         --   查询条件   (注意:   不要加   where)   
  AS
      
  declare   @strSQL       varchar(1000)          --   主语句   
  declare   @strTmp       varchar(300)           --   临时变量   
  declare   @strOrder     varchar(400)           --   排序类型   
    
  if  @IsCount  !=   0    --执行总数统计
  
    begin
      if @strWhere != ''   
          set   @strSQL   =   'select   count(*)   as   Total   from   ["   +   @tblName   +   "]  where ' + @strWhere 
      else
          set   @strSQL   =   'select   count(*)   as   Total   from   ["   +   @tblName   +   "]'
    end
    
  else                    --执行查询操作
  
  begin
            
if  @OrderType  !=   'asc'   
begin   
set   @strTmp   =   '<(select   min'   
set   @strOrder   =   '   order   by   ["   +   @Orderfld   +"]   desc'   
end   
else   
begin   
set  @strTmp   =   '>(select   max'   
set  @strOrder   =   '   order   by   ["   +   @Orderfld   +"]   asc'   
end   

set  @strSQL   =   'select   top   "   +   str(@PageSize)   +   "   " + @RetColumns + "    from   ["   
+   @tblName   +   "]   where   ["   +   @Orderfld   +   "]"   +   @strTmp   +   "(["   
+   @Orderfld   +   "])   from   (select   top   "   +   str((@PageIndex-1)*@PageSize)   +   "   ["   
+   @Orderfld   +   "]   from   ["   +   @tblName   +   "]"   +   @strOrder   +   ")   as   tblTmp)'   
+   @strOrder   

if  @strWhere  !=   ''   
set   @strSQL   =   'select   top   "   +   str(@PageSize)   +   "   " + @RetColumns + "   from   ["   
+   @tblName   +   "]   where   ["   +   @Orderfld   +   "]"   +   @strTmp   +   "(["   
+   @Orderfld   +   "])   from   (select   top   "   +   str((@PageIndex-1)*@PageSize)   +   "   ["   
+   @Orderfld   +   "]   from   ["   +   @tblName   +   "]   where   ("   +   @strWhere   +   ")   "   
+   @strOrder   +   ")   as   tblTmp)   and   ("   +   @strWhere   +   ")   '   +   @strOrder   

if  @PageIndex   =   1   
begin   
set   @strTmp   =  ''
if   @strWhere   !=   ''   
set   @strTmp   =   '   where   ("   +   @strWhere   +   ")'   

set   @strSQL   =   'select   top   "   +  str(@PageSize)   +   "   " + @RetColumns + "   from   ["  
+   @tblName   +   "]"   +   @strTmp   +   "   '   +   @strOrder   
end
 end
    
exec  (@strSQL)
运行时总是出错:
‘+str(@PageSize)+’附近有语法错误

解决方案 »

  1.   

    这个是我在网上找的一个分页查询的sql
    可是运行不了
      

  2.   

    消息 102,级别 15,状态 1,第 1 行
    '   +  @PageSize   +   ' 附近有语法错误。(1 行受影响)
      

  3.   

    双引号替换成单引号set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description: <Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[GetRecordFromPage]
    @tblName varchar(255), -- 表名 
      @RetColumns varchar(1000) = '*', -- 需要返回的列,默认为全部  
      @Orderfld varchar(255), -- 排序字段名  
      @PageSize int = 10, -- 页尺寸  
      @PageIndex int = 1, -- 页码  
      @IsCount bit = 0, -- 返回记录总数, 非 0 值则返回  
      @OrderType varchar(50) = 'asc', -- 设置排序类型, 非 asc 值则降序  
      @strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)  
      AS
       
      declare @strSQL varchar(1000) -- 主语句  
      declare @strTmp varchar(300) -- 临时变量  
      declare @strOrder varchar(400) -- 排序类型  
       
      if @IsCount != 0 --执行总数统计
      
      begin
      if @strWhere != ''  
      set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere 
      else
      set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
      end
       
      else --执行查询操作
      
      begin
       
    if @OrderType != 'asc'  
    begin  
    set @strTmp = '<(select min'  
    set @strOrder = ' order by [' + @Orderfld +'] desc'  
    end  
    else  
    begin  
    set @strTmp = '>(select max'  
    set @strOrder = ' order by [' + @Orderfld +'] asc'  
    end  set @strSQL = 'select top ' + ltrim(@PageSize) + ' ' + @RetColumns + ' from ['  
    + @tblName + '] where [' + @Orderfld + ']' + @strTmp + '(['  
    + @Orderfld + ']) from (select top ' + ltrim((@PageIndex-1)*@PageSize) + ' ['  
    + @Orderfld + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'  
    + @strOrder  if @strWhere != ''  
    set @strSQL = 'select top ' + ltrim(@PageSize) + ' ' + @RetColumns + ' from ['  
    + @tblName + '] where [' + @Orderfld + ']' + @strTmp + '(['  
    + @Orderfld + ']) from (select top ' + ltrim((@PageIndex-1)*@PageSize) + ' ['  
    + @Orderfld + '] from [' + @tblName + '] where (' + @strWhere + ') '  
    + @strOrder + ') as tblTmp) and (' + @strWhere + ') ' + @strOrder  if @PageIndex = 1  
    begin  
    set @strTmp = ''
    if @strWhere != ''  
    set @strTmp = ' where (' + @strWhere + ')'  set @strSQL = 'select top ' + str(@PageSize) + ' ' + @RetColumns + ' from ['
    + @tblName + ']' + @strTmp + ' ' + @strOrder  
    end
     end
       
    exec (@strSQL)