/*=============================================*/ /* Author: roy_88 */--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 GOdeclare T_cursor cursor local for select a.Name, b.Name from sysobjects a join syscolumns b on a.ID=b.ID join systypes c on c.xusertype=b.Xtype where a.xtype='U' and c.Name in('nvarchar','nchar','varchar','char') declare @tabName sysname,@ColName sysname open T_cursor fetch next from T_cursor into @tabName,@ColName while @@fetch_status=0 begin exec('update '+@tabName+' set '+@ColName+'=dbo.f_Convert('+@ColName+',0) where PATINDEX(N''%[!-~]%'' COLLATE LATIN1_GENERAL_BIN'+','+@ColName+')>0' fetch next from T_cursor into @tabName,@ColName end close T_cursor deallocate T_cursor-----------------------------------------改列的数据全角为半角 declare T_cursor cursor local for select a.Name, b.Name from sysobjects a join syscolumns b on a.ID=b.ID join systypes c on c.xusertype=b.Xtype where a.xtype='U' and c.Name in('nvarchar','nchar','varchar','char') declare @tabName sysname,@ColName sysname open T_cursor fetch next from T_cursor into @tabName,@ColName while @@fetch_status=0 begin exec('update '+@tabName+' set '+@ColName+'=dbo.f_Convert('+@ColName+',0) where PATINDEX(N''%[!-~]%'' COLLATE LATIN1_GENERAL_BIN'+','+@ColName+')>0')--少了) fetch next from T_cursor into @tabName,@ColName end close T_cursor deallocate T_cursor go --改列名全角为半角 declare T_cursor cursor local for select a.Name, b.Name from sysobjects a join syscolumns b on a.ID=b.ID where a.xtype='U' and PATINDEX(N'%[!-~]%' COLLATE LATIN1_GENERAL_BIN,b.Name)>0 declare @tabName sysname,@ColName sysname open T_cursor fetch next from T_cursor into @tabName,@ColName while @@fetch_status=0 begin exec('exe sp_rename '''+@tabName+'.'+@ColName+''',''dbo.f_Convert('+@ColName+',0)''') fetch next from T_cursor into @tabName,@ColName end close T_cursor deallocate T_cursor------------------------------------------------------ --改列名全角为半角 declare T_cursor cursor local for select a.Name+'.'+b.Name,NameNew=dbo.f_Convert(b.Name) from sysobjects a join syscolumns b on a.ID=b.ID where a.xtype='U' and PATINDEX(N'%[!-~]%' COLLATE LATIN1_GENERAL_BIN,b.Name)>0 declare @tabName sysname,@ColName sysname open T_cursor fetch next from T_cursor into @tabName,@ColName while @@fetch_status=0 begin exe sp_rename @tabName,@ColName fetch next from T_cursor into @tabName,@ColName end close T_cursor deallocate T_cursor
用这个简单些.实现全角与半角字符转换的处理函数 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
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
兄弟,你得去调用函数.我们上面给你的是函数.create table tb(col nvarchar(20)) insert into tb values(N'全角') insert into tb values(N'半角')go 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 GOselect col 转换前 , dbo.f_Convert(col , 0) 转换后 from tbdrop table tb drop function dbo.f_Convert/*转换前 转换后 -------------------- ---------- 全角 全角 半角 半角(所影响的行数为 2 行) */
这个可以 ,亲测 select candidate_name,dbo.f_Convert(requirement_alias,0) from interview_record update interview_record set requirement_alias=dbo.f_Convert(requirement_alias,0)
/* Author: roy_88 */--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
GOdeclare T_cursor cursor local for
select
a.Name, b.Name
from
sysobjects a
join
syscolumns b on a.ID=b.ID
join
systypes c on c.xusertype=b.Xtype
where
a.xtype='U' and c.Name in('nvarchar','nchar','varchar','char')
declare @tabName sysname,@ColName sysname
open T_cursor
fetch next from T_cursor into @tabName,@ColName
while @@fetch_status=0
begin
exec('update '+@tabName+' set '+@ColName+'=dbo.f_Convert('+@ColName+',0) where PATINDEX(N''%[!-~]%'' COLLATE LATIN1_GENERAL_BIN'+','+@ColName+')>0'
fetch next from T_cursor into @tabName,@ColName
end
close T_cursor
deallocate T_cursor-----------------------------------------改列的数据全角为半角
declare T_cursor cursor local for
select
a.Name, b.Name
from
sysobjects a
join
syscolumns b on a.ID=b.ID
join
systypes c on c.xusertype=b.Xtype
where
a.xtype='U' and c.Name in('nvarchar','nchar','varchar','char')
declare @tabName sysname,@ColName sysname
open T_cursor
fetch next from T_cursor into @tabName,@ColName
while @@fetch_status=0
begin
exec('update '+@tabName+' set '+@ColName+'=dbo.f_Convert('+@ColName+',0) where PATINDEX(N''%[!-~]%'' COLLATE LATIN1_GENERAL_BIN'+','+@ColName+')>0')--少了)
fetch next from T_cursor into @tabName,@ColName
end
close T_cursor
deallocate T_cursor
go
--改列名全角为半角
declare T_cursor cursor local for
select
a.Name, b.Name
from
sysobjects a
join
syscolumns b on a.ID=b.ID
where
a.xtype='U' and PATINDEX(N'%[!-~]%' COLLATE LATIN1_GENERAL_BIN,b.Name)>0
declare @tabName sysname,@ColName sysname
open T_cursor
fetch next from T_cursor into @tabName,@ColName
while @@fetch_status=0
begin
exec('exe sp_rename '''+@tabName+'.'+@ColName+''',''dbo.f_Convert('+@ColName+',0)''')
fetch next from T_cursor into @tabName,@ColName
end
close T_cursor
deallocate T_cursor------------------------------------------------------
--改列名全角为半角
declare T_cursor cursor local for
select
a.Name+'.'+b.Name,NameNew=dbo.f_Convert(b.Name)
from
sysobjects a
join
syscolumns b on a.ID=b.ID
where
a.xtype='U' and PATINDEX(N'%[!-~]%' COLLATE LATIN1_GENERAL_BIN,b.Name)>0
declare @tabName sysname,@ColName sysname
open T_cursor
fetch next from T_cursor into @tabName,@ColName
while @@fetch_status=0
begin
exe sp_rename @tabName,@ColName
fetch next from T_cursor into @tabName,@ColName
end
close T_cursor
deallocate T_cursor
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
drop function [dbo].[f_convert]
GO
/*--全角/半角转换
转换说明
全角字符从的unicode编码从65281~65374
半角字符从的unicode编码从 33~126
空格比较特殊,全角为 12288,半角为 32
而且除空格外,全角/半角按unicode编码排序在顺序上是对应的
所以可以直接通过用+-法来处理非空格数据,对空格单独处理
like的时候,指定排序规则 COLLATE Latin1_General_BIN
是保证字符顺序按unicode编码排序
(此函数部分思路参考了CSDN上大力的转换函数)
--邹建 2005.01(引用请保留此信息)--*/
/*--调用示例
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'%[!-~]%',@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
select dbo.f_convert(列名,0),dbo.f_convert(列名,1)
insert into tb values(N'全角')
insert into tb values(N'半角')go
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
GOselect col 转换前 , dbo.f_Convert(col , 0) 转换后 from tbdrop table tb
drop function dbo.f_Convert/*转换前 转换后
-------------------- ----------
全角 全角
半角 半角(所影响的行数为 2 行)
*/
select candidate_name,dbo.f_Convert(requirement_alias,0) from interview_record
update interview_record set requirement_alias=dbo.f_Convert(requirement_alias,0)