日期:2014-05-18  浏览次数:20419 次

全角转半角的函数 求大神解释
以下是函数的创建
有几个问题不明白 
SQL code


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_convert]') and xtype in (N'FN', N'IF', N'TF'))   
  drop function [dbo].[f_convert]   
GO   
    
  /*--全角/半角转换   
    
  转换说明   
  全角字符从的unicode编码从65281~65374   
  半角字符从的unicode编码从       33~126   
  空格比较特殊,全角为   12288,半角为   32   
  而且除空格外,全角/半角按unicode编码排序在顺序上是对应的   
  所以可以直接通过用+-法来处理非空格数据,对空格单独处理   
  like的时候,指定排序规则   COLLATE   Latin1_General_BIN   
  是保证字符顺序按unicode编码排序  

    
  declare   @s1   varchar(8000)   
  select   @s1='中    2-3456a78STUVabn中国opwxyz'   
  select   dbo.f_convert(@s1,0),dbo.f_convert(@s1,1)   
  */   
  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'%[!-~]%',      //这里的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  




这里的N 是什么意思? %[!-~]% 是什么意思?

求解释 !-~是指的unicode码是从!开始到~结束吗?查了一下好像不是啊

------解决方案--------------------
%[!-~]% 指的是类似于 !-~的字符
------解决方案--------------------
SQL code
是範圍大小關系如下 

select 
top 94 n=identity(tinyint,33,1) 
into #1 
from syscolumns  

select 
nchar(n+65248) AS 全角 ,char(n) AS 半角 
from #1  
/*
全角    半角
!    !
"    "
#    #
$    $
%    %
&    &
'    '
(    (
)    )
*    *
+    +
,    ,
-    -
.    .
/    /
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
:    :
;    ;
<    <
=    =
>    >
?    ?
@    @
A    A
B    B
C    C
D    D
E    E
F    F
G    G
H    H
I    I
J    J
K    K
L    L
M    M
N    N
O    O
P    P
Q    Q
R    R
S    S
T    T
U    U
V    V
W    W
X    X
Y    Y
Z    Z
[    [
\    \
]    ]
^    ^
_    _
`    `
a    a
b    b
c    c
d    d
e    e
f    f
g    g
h    h
i    i
j    j
k    k
l    l
m    m
n    n
o    o
p    p
q    q
r    r
s    s
t    t
u    u
v    v
w    w
x    x
y    y
z    z
{    {
|    |
}    }
~    ~
*/