Sql Server 中汉字处理排序规则,全角半角

-- 1. 为数据库指定排序规则
CREATE   DATABASE  db COLLATE Chinese_PRC_CI_AS
GO

ALTER   DATABASE  db COLLATE Chinese_PRC_BIN
GO


/*====================================*/


-- 2. 为表中的列指定排序规则
CREATE   TABLE  tb(
col1 
varchar ( 10 ),
col2 
varchar ( 10 ) COLLATE Chinese_PRC_CI_AS)
GO

ALTER   TABLE  tb  ADD  col3  varchar ( 10 ) COLLATE Chinese_PRC_BIN
GO

ALTER   TABLE  tb  ALTER   COLUMN  col2  varchar ( 10 ) COLLATE Chinese_PRC_BIN
GO


/*====================================*/


-- 3. 为字符变量和参数应用排序规则
DECLARE   @a   varchar ( 10 ), @b   varchar ( 10 )
SELECT   @a = ' a ' , @b = ' A '

-- 使用排序规则 Chinese_PRC_CI_AS
SELECT   CASE   WHEN   @a  COLLATE Chinese_PRC_CI_AS  =   @b   THEN   ' @a=@b '   ELSE   ' @a<>@b '   END
-- 结果:@a=@b

-- 使用排序规则 Chinese_PRC_BIN
SELECT   CASE   WHEN   @a  COLLATE Chinese_PRC_BIN  =   @b   THEN   ' @a=@b '   ELSE   ' @a<>@b '   END
-- 结果:@a<>@b
-- 1. 按拼音排序
DECLARE   @t   TABLE (col  varchar ( 2 ))
INSERT   @t   SELECT   ' '
UNION   ALL   SELECT   ' '
UNION   ALL   SELECT   ' '

SELECT   *   FROM   @t   ORDER   BY  col COLLATE Chinese_PRC_CS_AS_KS_WS
/*--结果
col  
---- 



--
*/

GO


/*==========================================*/


-- 2. 汉字首字母查询处理用户定义函数
CREATE   FUNCTION  f_GetPY( @str   nvarchar ( 4000 ))
RETURNS   nvarchar ( 4000 )
AS
BEGIN
    
DECLARE   @py   TABLE (
        ch 
char ( 1 ),
        hz1 
nchar ( 1 ) COLLATE Chinese_PRC_CS_AS_KS_WS,
        hz2 
nchar ( 1 ) COLLATE Chinese_PRC_CS_AS_KS_WS)
    
INSERT   @py   SELECT   ' A ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' B ' ,N ' ' ,N ' 簿 '
    
UNION    ALL   SELECT   ' C ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' D ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' E ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' F ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' G ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' H ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' J ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' K ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' L ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' M ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' N ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' O ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' P ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' Q ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' R ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' S ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' T ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' W ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' X ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' Y ' ,N ' ' ,N ' '
    
UNION    ALL   SELECT   ' Z ' ,N ' ' ,N ' '
    
DECLARE   @i   int
    
SET   @i = PATINDEX ( ' %[吖-做]% '  COLLATE Chinese_PRC_CS_AS_KS_WS, @str )
    
WHILE   @i > 0
        
SELECT   @str = REPLACE ( @str , SUBSTRING ( @str , @i , 1 ),ch)
            ,
@i = PATINDEX ( ' %[吖-做]% '  COLLATE Chinese_PRC_CS_AS_KS_WS, @str )
        
FROM   @py
        
WHERE   SUBSTRING ( @str , @i , 1 BETWEEN  hz1  AND  hz2
    
RETURN ( @str )
END
GO

-- 1.查询区分全角与半角字符
--
测试数据
DECLARE   @t   TABLE (col  varchar ( 10 ))
INSERT   @t   SELECT   ' aa '
UNION   ALL   SELECT   ' Aa '
UNION   ALL   SELECT   ' AA '        -- 全角A
UNION   ALL   SELECT   ' A,A '          -- 全角A,半角逗号(,)
UNION   ALL   SELECT   ' A,A '      -- 全角A,全角逗号(,)

-- 1.查大写字母
SELECT   *   FROM   @t
WHERE  col COLLATE Chinese_PRC_CS_AS_WS  like   ' %A% '

-- 2.查全角字母
SELECT   *   FROM   @t
WHERE  col COLLATE Chinese_PRC_CS_AS_WS  like   ' %A% '

-- 3.查半角逗号(,)
SELECT   *   FROM   @t
WHERE  col COLLATE Chinese_PRC_CS_AS_WS  like   ' %,% '

-- 3.查全角逗号(,)
SELECT   *   FROM   @t
WHERE  col COLLATE Chinese_PRC_CS_AS_WS  like   ' %,% '
GO


/*=============================================*/


-- 2 实现全角与半角字符转换的处理函数
CREATE   FUNCTION  f_Convert(
@str   NVARCHAR ( 4000 ),  -- 要转换的字符串
@flag   bit                -- 转换标志,0转换成半角,1转换成全角
) RETURNS   nvarchar ( 4000 )
AS
BEGIN
    
DECLARE   @pat   nvarchar ( 8 ), @step   int , @i   int , @spc   int
    
IF   @flag = 0
        
SELECT   @pat = N ' %[!-~]% ' , @step =- 65248 ,
            
@str = REPLACE ( @str ,N '   ' ,N '   ' )
    
ELSE
        
SELECT   @pat = N ' %[!-~]% ' , @step = 65248 ,
            
@str = REPLACE ( @str ,N '   ' ,N '   ' )
    
SET   @i = PATINDEX ( @pat  COLLATE LATIN1_GENERAL_BIN, @str )
    
WHILE   @i > 0
        
SELECT   @str = REPLACE ( @str ,
                
SUBSTRING ( @str , @i , 1 ),
                
NCHAR ( UNICODE ( SUBSTRING ( @str , @i , 1 )) + @step ))
            ,
@i = PATINDEX ( @pat  COLLATE LATIN1_GENERAL_BIN, @str )
    
RETURN ( @str )
END
GO

你可能感兴趣的:(SQL Server)