CREATE PROCEDURE  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)
用 ''替换' ??调试通不过。

解决方案 »

  1.   

    可以阿CREATE PROCEDURE  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)
      

  2.   


    --try:CREATE PROCEDURE  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)
    go
    --调用:
    exec GetRecordFromPage 'os','*','id',20,3,0,'asc', ' name=''wsp'''
      

  3.   

    sql查询分析器,编辑--替换"为 'create PROCEDURE  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)
      

  4.   

    这里错了:set   @strTmp   =   "" 
    当表示空串时,必须用单引号,因为这时它不是用作分隔符。如果想在程序中用""来做分隔符,需要设置:SET QUOTED_IDENTIFIER ON
      

  5.   

    有时为了在动态sql里加上单引号',必须再加一个'作为它的转义。
    因此别把连续两个单引号和一个双引号弄混了