`
wfdoublext
  • 浏览: 129763 次
  • 性别: 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('徐希望')

分享到:
评论

相关推荐

    拼音首字母检索

    这种技术的目的是为了提高用户在大量中文信息中寻找特定条目的效率,因为它允许用户通过输入联系人姓名的拼音首字母来快速定位目标。 在实现这个功能时,首先需要对中文姓名进行拼音转换。这通常涉及到汉字到拼音的...

    H5首字母检索通讯录

    在这个H5通讯录中,系统会对每个联系人的姓名进行拼音处理,然后根据拼音首字母进行分类,用户可以通过点击首字母来快速定位到相应的联系人。 实现这个功能,我们需要以下关键技术: 1. **拼音库**:H5页面需要一...

    android快速滑动列表+首字母提示(仿通讯录)

    3. **首字母提示**:在通讯录应用中,通常会根据联系人姓名的首字母进行分组,便于用户快速定位。实现这一功能需要对列表数据进行排序,并在侧边栏(也称为抽屉或快速选择器)中显示每个字母,用户点击字母时会跳转...

    联系人列表(右侧带首字母检索、分类和快速定位)

    在联系人列表中,按联系人姓名的首字母进行分类是一种常见的组织方式。这种设计使得用户能够快速找到特定联系人,特别是在大量联系人的情况下。实现时,通常会先对联系人列表进行排序,然后按照每个联系人名字的首...

    jQuery仿手机通讯录首字母查找联系人代码.zip

    通过比较用户输入的首字母和联系人姓名的首字母,筛选出匹配项。然后,使用`$.append()`或`html()`方法更新列表区域,展示匹配的联系人。 此外,CSS文件用于定义界面的样式。比如,它可能设置了输入框的外观、列表...

    联系人分章节显示、ListView快速滑动显示联系人首字母、附带字母表快速查找的例子

    本示例主要关注如何实现这些特性,包括根据联系人姓名的首字母进行分组显示,利用侧滑字母表实现快速定位,以及优化ListView的滚动性能。 首先,我们要理解联系人分章节显示的概念。这是通过将联系人数据按照首字母...

    微信小程序-首字母排序选择-程序源码.zip

    在这个项目中,开发者可能使用了JavaScript数组的sort()方法,根据对象数组中的特定字段(如姓名或关键词)的首字母进行排序。在中文环境中,需要处理汉字的拼音首字母,这通常涉及到JavaScript库如pinyin.js,它...

    手机通讯录按照字母排序点击找到联系人

    3. **排序逻辑**:利用JavaScript,对联系人列表进行排序,根据姓名的首字母进行升序排列。Vue.js 的 computed 属性可以用于实时计算排序后的列表。 4. **问题修复**:“小bug”可能指的是排序不正确,或者点击字母...

    通讯录字母检索功能源码

    7. **适配多语言**:考虑到不同地区的用户,字母检索可能需要支持全角字符(如中文姓名的拼音首字母)和非拉丁字母(如俄语、希腊语等)。 通过上述分析,我们可以看出,"通讯录字母检索功能源码"涵盖了数据结构...

    仿微信H5通讯录根据js文件中的内容动态生成通讯录内容,可搜索

    在本文中,我们将深入探讨如何使用Vue.js框架和H5技术来创建一个仿微信通讯录功能,该功能包括按字母和汉字首字母分类排序、页面滚动、拼音首字母搜索以及处理特殊字符。这个项目的核心是根据JavaScript文件中的数据...

    CM7最新联系人代码(追加自动IP拨号、拼音首字母快速检索等功能)

    《CM7最新联系人代码解析:自动IP拨号与拼音首字母检索技术详解》 在Android系统中,联系人管理是用户日常操作的核心部分之一。CM7,作为一款基于Android的深度定制系统,其在联系人功能上进行了一系列优化,为用户...

    A-Z字母排序和过滤搜索功能

    3. **排序算法**:对ListView的数据源(通常是ArrayList)进行遍历,使用拼音库计算每个元素的首字母,并将其保存到对应字段。然后可以使用Java的`Collections.sort()`方法,提供自定义比较器(Comparator)来根据...

    Android-仿微信通讯录的实现联系人按字母分组显示右侧添加快速索引条

    对于快速索引条的显示,可以利用`OnGlobalLayoutListener`监听整个列表的布局完成,然后遍历联系人列表,统计每个首字母出现的次数,将其绘制到快速索引条上。这样可以确保快速索引条的高度与实际需要的大小相符,...

    获取手机联系人并按字母排序,且可根据字母右侧A~Z检索

    Comparator的compare()方法需要比较两个联系人名字的首字母,确保它们按照字母顺序排列。 为了实现字母右侧A~Z的检索功能,我们可以创建一个侧边栏(通常称为字母栏或快速索引栏)。当用户点击某个字母时,应用会...

    仿qq,微信的好友列表效果,可搜索,可滚动,可顶开首字母排序

    这个项目旨在实现一个功能齐全、用户体验良好的好友列表界面,其中包括搜索、滚动以及按首字母排序等特性。以下是关于这个项目的详细知识点: 1. **ListView与RecyclerView**: - 为了实现好友列表的展示,开发者...

    联系人列表字母索引

    2. **数据结构与排序**:在实现这一功能时,开发者需要将联系人数据按姓名的首字母顺序进行排序。这可能涉及到数据库查询优化,例如在数据库表中创建一个基于姓名的索引,以便快速地按照字母顺序获取联系人。 3. **...

    Android字母导航

    Adapter需要知道如何获取每个条目的首字母,并根据首字母更新头部视图。 **实现步骤:** 1. **创建字母栏布局**:使用LinearLayout或HorizontalScrollView创建一个包含所有字母的布局。 2. **设置点击事件**:为...

    Android系统联系人全特效实现,字母表快速滚动

    1. **计算首字母**:首先,我们需要对所有联系人姓名进行预处理,获取每个名字的首字母。考虑到中文姓名,我们可以使用Pinyin4j库将汉字转换为拼音,然后提取首字母。 2. **创建索引**:将所有首字母按字母顺序排列...

    微信小程序首字符排序-通讯录.rar

    1. `picker`选择器:用户可以选择联系人首字母,快速定位到相应区域。 2. `view`视图:显示联系人列表,每个联系人作为一个独立的`view`项。 3. `text`文本:展示联系人的姓名、电话等信息。 4. `button`按钮:可能...

    仿电话本右侧字母导航

    这种设计灵感来源于传统的电话簿,人们可以通过查看字母表来快速定位到特定的姓名首字母,从而找到对应的联系人。在数字化的现代应用中,这一功能被巧妙地移植到了屏幕的右侧,以滚动的字母条形式呈现,用户只需轻轻...

Global site tag (gtag.js) - Google Analytics