`
wfdoublext
  • 浏览: 126394 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

分页 ,去姓名首字母

    博客分类:
  • SQL
 
阅读更多

 

 

 

 

 

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

go

 

 

--/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/

 

 --declare  @pagecount int declare @counts int

 --exec proc_fun_pagination 'sys_user','*',2,2,'userid',0,null,'userid',0--,@pagecount output,@counts output

 

ALTER PROCEDURE [dbo].[proc_fun_Pagination] 

 ( 

 @tblName     nvarchar(200),        ----要显示的表或多个表的连接 

 @fldName     nvarchar(500) = '*',    ----要显示的字段列表 

 @pageSize    int = 10,        ----每页显示的记录个数 

 @page        int = 1,        ----要显示那一页的记录 

 @fldSort    nvarchar(200) = null,    ----排序字段列表或条件 

 @Sort        bit = 0,        ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ') 

 @strCondition    nvarchar(1000) = null,    ----查询条件,不需where 

 @ID        nvarchar(150),        ----主表的主键 

 @Dist                 bit = 0,           ----是否添加查询字段的 DISTINCT 默认0不添加/1添加 

 @pageCount    int = 1 output,            ----查询结果分页后的总页数 

 @Counts    int = 1 output                ----查询到的记录数 

 ) 

 AS 

 SET NOCOUNT ON 

 Declare @sqlTmp nvarchar(1000)        ----存放动态生成的SQL语句 

 Declare @strTmp nvarchar(1000)        ----存放取得查询结果总数的查询语句 

 Declare @strID     nvarchar(1000)        ----存放取得查询开头或结尾ID的查询语句 

 

 Declare @strSortType nvarchar(10)    ----数据排序规则A 

 Declare @strFSortType nvarchar(10)    ----数据排序规则B 

 

 Declare @SqlSelect nvarchar(50)         ----对含有DISTINCT的查询进行SQL构造 

 Declare @SqlCounts nvarchar(50)          ----对含有DISTINCT的总数查询进行SQL构造 

 

 --declare @timediff datetime  --耗时测试时间差 

 --select @timediff=getdate() 

 

 if @Dist  = 0 

 begin 

     set @SqlSelect = 'select ' 

     set @SqlCounts = 'Count(*)' 

 end 

 else 

 begin 

     set @SqlSelect = 'select distinct ' 

     set @SqlCounts = 'Count(DISTINCT '+@ID+')' 

 end 

 

 

 if @Sort=0 

 begin 

     set @strFSortType=' ASC ' 

     set @strSortType=' DESC ' 

 end 

 else 

 begin 

     set @strFSortType=' DESC ' 

     set @strSortType=' ASC ' 

 end 

 

 

 

 --------生成查询语句-------- 

 --此处@strTmp为取得查询结果数量的语句 

if @strCondition is null or @strCondition=''     --没有设置显示条件 

 begin 

     set @sqlTmp =  @fldName + ' From ' + @tblName 

     set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName 

     set @strID = ' From ' + @tblName 

 end 

 else 

 begin 

     set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition 

     set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition 

     set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition 

 end 

 

 ----取得查询结果总数量----- 

 exec sp_executesql @strTmp,N'@Counts int out ',@Counts out 

 declare @tmpCounts int 

 if @Counts = 0 

     set @tmpCounts = 1 

 else 

     set @tmpCounts = @Counts 

 

     --取得分页总数 

     set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize 

 

     /**//**当前页大于总页数 取最后一页**/ 

     if @page>@pageCount 

         set @page=@pageCount 

 

     --/*-----数据分页2分处理-------*/ 

     declare @pageIndex int --总数/页大小 

     declare @lastcount int --总数%页大小  

 

     set @pageIndex = @tmpCounts/@pageSize 

     set @lastcount = @tmpCounts%@pageSize 

     if @lastcount > 0 

         set @pageIndex = @pageIndex + 1 

     else 

         set @lastcount = @pagesize 

 

     --//***显示分页 

     if @strCondition is null or @strCondition=''     --没有设置显示条件 

     begin 

         if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理 

             begin  

                 if @page=1 

                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName                         

                         +' order by '+ @fldSort +' '+ @strFSortType 

                 else 

                 begin 

                     if @Sort=1 

                     begin                     

                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                         +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 

                         +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 

                         +' order by '+ @fldSort +' '+ @strFSortType 

                     end 

                     else 

                     begin 

                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                         +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 

                         +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 

                         +' order by '+ @fldSort +' '+ @strFSortType  

                     end 

                 end     

             end 

         else 

             begin 

             set @page = @pageIndex-@page+1 --后半部分数据处理 

                 if @page <= 1 --最后一页数据显示                 

                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                         +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType  

                 else 

                     if @Sort=1 

                     begin 

                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                         +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 

                         +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 

                         +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 

                     end 

                     else 

                     begin 

                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                         +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 

                         +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 

                         +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType  

                     end 

             end 

     end 

 

     else --有查询条件 

     begin 

         if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理 

         begin 

                 if @page=1 

                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName                         

                         +' where 1=1 ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType 

                 else if(@Sort=1) 

                 begin                     

                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                        +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 

                         +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 

                         +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType 

                 end 

                 else 

                 begin 

                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                        +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 

                         +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 

                         +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType  

                 end            

         end 

         else 

         begin  

             set @page = @pageIndex-@page+1 --后半部分数据处理 

             if @page <= 1 --最后一页数据显示 

                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                        +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType                      

            else if(@Sort=1) 

                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                         +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 

                         +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 

                         +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType     

             else 

                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 

                         +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 

                        +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 

                         +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType             

         end     

     end 

 

 ------返回查询结果----- 

 exec sp_executesql @strTmp 

 --select datediff(ms,@timediff,getdate()) as 耗时 

 --print @strTmp 

 SET NOCOUNT OFF 

 

 

 

 

 

 

 

--------------------------------

 

 

 

 

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

go

 

 

create FUNCTION [dbo].[fun_getPY]   

(   

    @str NVARCHAR(4000)   

)   

RETURNS NVARCHAR(4000)   

AS  

BEGIN  

    DECLARE @word NCHAR(1),@PY NVARCHAR(4000)   

    SET @PY=''  

    WHILE len(@str)>0   

    BEGIN  

        SET @word=left(@str,1)   

        SET @PY=@PY+(CASE WHEN unicode(@word) BETWEEN 19968 AND 19968+20901   

        THEN (SELECT TOP 1 PY FROM (   

        SELECT 'A' AS PY,N'驁' AS word   

        UNION ALL SELECT 'B',N'簿'  

        UNION ALL SELECT 'C',N'錯'  

        UNION ALL SELECT 'D',N'鵽'  

        UNION ALL SELECT 'E',N'樲'  

        UNION ALL SELECT 'F',N'鰒'  

        UNION ALL SELECT 'G',N'腂'  

        UNION ALL SELECT 'H',N'夻'  

        UNION ALL SELECT 'J',N'攈'  

        UNION ALL SELECT 'K',N'穒'  

        UNION ALL SELECT 'L',N'鱳'  

        UNION ALL SELECT 'M',N'旀'  

        UNION ALL SELECT 'N',N'桛'  

        UNION ALL SELECT 'O',N'漚'  

        UNION ALL SELECT 'P',N'曝'  

        UNION ALL SELECT 'Q',N'囕'  

        UNION ALL SELECT 'R',N'鶸'  

        UNION ALL SELECT 'S',N'蜶'  

        UNION ALL SELECT 'T',N'籜'  

        UNION ALL SELECT 'W',N'鶩'  

        UNION ALL SELECT 'X',N'鑂'  

        UNION ALL SELECT 'Y',N'韻'  

        UNION ALL SELECT 'Z',N'咗'  

        ) T    

        WHERE word>=@word COLLATE Chinese_PRC_CS_AS_KS_WS    

        ORDER BY PY ASC) ELSE @word END)   

        SET @str=right(@str,len(@str)-1)   

    END  

    RETURN @PY   

END

 

 

select dbo.fun_getPY('徐希望')

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics