--改类型的话,你可以参考下面的存储过程if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_set]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_set]
GO/*--将所有的表中,数值类型由char,varchar改为nchar,nvarchar --*//*--调用示例:
exec p_set
--*/
--修改的存储过程
create procedure p_set
as
declare tb cursor for
SELECT sql='alter table ['+d.name
+'] alter column ['+a.name+'] n'
+b.name+'('+cast(a.length*2 as varchar)+')'
FROM syscolumns a
left join systypes b on a.xtype=b.xusertype
inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
where
b.name in('char','varchar')
and
not exists(SELECT 1 FROM sysobjects where xtype='PK' and name in (
SELECT name FROM sysindexes WHERE indid in(
SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid
))) --主键不能修改
order by d.name,a.namedeclare @sql varchar(1000)
open tb
fetch next from tb into @sql
while @@fetch_status = 0
begin
exec(@sql)
fetch next from tb into @sql
end
close tb
deallocate tb
go
drop procedure [dbo].[p_set]
GO/*--将所有的表中,数值类型由char,varchar改为nchar,nvarchar --*//*--调用示例:
exec p_set
--*/
--修改的存储过程
create procedure p_set
as
declare tb cursor for
SELECT sql='alter table ['+d.name
+'] alter column ['+a.name+'] n'
+b.name+'('+cast(a.length*2 as varchar)+')'
FROM syscolumns a
left join systypes b on a.xtype=b.xusertype
inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
where
b.name in('char','varchar')
and
not exists(SELECT 1 FROM sysobjects where xtype='PK' and name in (
SELECT name FROM sysindexes WHERE indid in(
SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid
))) --主键不能修改
order by d.name,a.namedeclare @sql varchar(1000)
open tb
fetch next from tb into @sql
while @@fetch_status = 0
begin
exec(@sql)
fetch next from tb into @sql
end
close tb
deallocate tb
go
drop function [dbo].[f_convert]
GO--创建一个函数,替换指定字符串中的varchar为nvarchar
create function f_convert(@text nvarchar(4000))
returns varchar(8000)
as
begin
declare @i1 int,@i2 int,@i3 varchar(20),@re varchar(8000)
select @i1=patindex('% varchar(%)%',@text)
,@i2=charindex(')',@text,@i1)
,@i3=substring(@text,@i1+9,@i2-@i1-9)
,@re='' while @i1>0 and @i2>0
begin
if isnumeric(@i3)=1
if @i3>4000
select @re=@re+left(@text,@i1)+'nvarchar(4000)'
else
select @re=@re+left(@text,@i1)+'nvarchar('
+substring(@text,@i1+9,@i2-@i1-8)
else
select @re=@re+left(@text,@i2)
select @text=stuff(@text,1,@i2,'')
,@i1=patindex('% varchar(%)%',@text)
,@i2=charindex(')',@text,@i1)
,@i3=substring(@text,@i1+9,@i2-@i1-9)
end
return(@re+@text)
end
go--调用函数实现转换处理:declare @id int,@name sysname
declare @s1 varchar(8000),@s2 varchar(8000),@s3 varchar(8000)declare tb cursor local for
select top 1 id,'['+replace(name,']',']]')+']' from sysobjects a
where xtype='P' and status>=0 and exists(
select 1 from syscomments
where id=a.id and charindex('varchar(',text)>0)
open tb
fetch tb into @id,@name
while @@fetch_status=0
begin
select @s1='',@s2='',@s3='' select @s1=@s1+',@'+cast(colid as varchar)+' varchar(8000)'
,@s2=@s2+';select @'+cast(colid as varchar)
+'=f_convert(text) from syscomments where id='
+cast(@id as varchar)+' and colid='+cast(colid as varchar)
,@s3=@s3+'+@'+cast(colid as varchar)
from syscomments
where id=@id
order by colid select @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s3=stuff(@s3,1,1,'')
exec('declare '+@s1+'
'+@s2+'
drop proc '+@name+'
exec('+@s3+')
')
fetch tb into @id,@name
end
close tb
deallocate tb
一个方法是客户端程序判断操作系统的语言,在客户端转换后写入数据库,也就是说,只在客户端解决。
但是如果不是通过客户端程序写入的数据就很难控制,我觉得最好先在改一次,用unicode,一劳永逸。
如果更改数据类型,就象 dut 所讲的问题,识别客户端输入的内码,也同样可以解决吗?
客户端写入简体,繁体是否都可以正确显示?
因为当时设计时表的名称有部份采用的是简体中文,是否需要另外更改名称?
客户端查询亦有用中文表名,是否需要更改?
客户端程序现在有三种版本(英,简,繁),但查询表名问题还没有很好解决……
更改数据类型可以使用 zjcxc(邹建) 兄的方式,但更改中文名又成了一个很大的工程,以前的程序员做的是中文名,现在我来收这个摊子……客户端需要更改,表名同样需要更改……但不知道有没有其它的函数,dll什么的可以一次更改呀?哎,要不然,又够我惨的啦……
请各位大侠发表意见,谢谢!