sqlserver 2008 varchar字段 转 nvarchar 存储过程

䶮字 在数据库中 必须  用 nvarchar  类型 才能正常显示

可数据库原来 是 varchar  ,怎么办,换 nvarchar

然后  update table set bb = N'䶮' 

数据库设计时  有中文的 还是 用 nvarchar   方便扩展

USE [table]
GO
/****** 对象:  StoredProcedure [dbo].[p_changevar2nvar]    脚本日期: 10/12/2019 11:21:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[p_changevar2nvar](@tablename varchar(100),@column varchar(100))
as

declare @i int;
declare @tbName varchar(100);
declare @DFName varchar(100);
declare @SqlStr1 varchar(8000);
declare @SqlStr2 varchar(8000);
declare @SqlStr3 varchar(8000);

WITH tx AS(
SELECT a.object_id
              ,b.name AS schema_name
              ,a.name AS table_name
              ,c.name as ix_name
              ,c.is_unique AS ix_unique
              ,c.type_desc AS ix_type_desc
              ,d.index_column_id
              ,d.is_included_column
              ,e.name AS column_name
              ,f.name AS fg_name
              ,d.is_descending_key AS is_descending_key
              ,c.is_primary_key
              ,c.is_unique_constraint
          FROM sys.tables AS a
         INNER JOIN sys.schemas AS b            ON a.schema_id = b.schema_id AND a.is_ms_shipped = 0
         INNER JOIN sys.indexes AS c            ON a.object_id = c.object_id
         INNER JOIN sys.index_columns AS d      ON d.object_id = c.object_id AND d.index_id = c.index_id
         INNER JOIN sys.columns AS e            ON e.object_id = d.object_id AND e.column_id = d.column_id
         INNER JOIN sys.data_spaces AS f        ON f.data_space_id = c.data_space_id
         where a.name = @tablename
)
SELECT
       Drop_Index   = CASE WHEN (a.is_primary_key = 1 OR a.is_unique_constraint = 1)
                           THEN 'ALTER TABLE ' + a.table_name + ' DROP CONSTRAINT ' + a.ix_name
                           ELSE 'DROP INDEX ' + a.ix_name collate SQL_Latin1_General_CP1_CI_AS + ' ON ' + a.schema_name + '.' + a.table_name  END
      ,Create_Index = CASE WHEN (a.is_primary_key = 1 OR a.is_unique_constraint = 1)
                           THEN 'ALTER TABLE ' + a.table_name + ' ADD CONSTRAINT ' + a.ix_name 
                               + CASE WHEN a.is_primary_key = 1 THEN ' PRIMARY KEY' ELSE ' UNIQUE' END + '(' + indexColumns.ix_index_column_name + ')'
                           ELSE 'CREATE ' + CASE WHEN a.ix_unique = 1 THEN 'UNIQUE ' ELSE '' END 
                               + a.ix_type_desc + ' INDEX ' + a.ix_name collate SQL_Latin1_General_CP1_CI_AS + ' ON ' + a.schema_name
                               + '.' + a.table_name + '(' + indexColumns.ix_index_column_name + ')'
                               + CASE WHEN IncludeIndex.ix_included_column_name IS NOT NULL THEN ' INCLUDE (' + IncludeIndex.ix_included_column_name + ')' ELSE '' END
                               + ' ON [' + a.fg_name +']' END
      ,CASE WHEN a.ix_unique = 1 THEN 'UNIQUE' END AS ix_unique
      ,a.ix_type_desc
      ,a.ix_name
      ,a.schema_name
      ,a.table_name
      ,indexColumns.ix_index_column_name
      ,IncludeIndex.ix_included_column_name
      ,a.fg_name
      ,a.is_primary_key
      ,a.is_unique_constraint  into #tmptb1                              
FROM
(
        SELECT DISTINCT
               ix_unique
              ,ix_type_desc
              ,ix_name
              ,schema_name
              ,table_name
              ,fg_name
              ,is_primary_key
              ,is_unique_constraint
          FROM tx
) AS a
OUTER APPLY
(
        SELECT ix_index_column_name
               = STUFF((
                        SELECT ',' + column_name + CASE WHEN is_descending_key = 1 THEN ' DESC' ELSE '' END
                          FROM tx AS b
                         WHERE schema_name = a.schema_name
                           AND table_name=a.table_name
                           AND ix_name=a.ix_name
                           AND ix_type_desc=a.ix_type_desc
                           AND fg_name=a.fg_name
                           AND is_included_column=0
                         ORDER BY index_column_id
                           FOR XML PATH('')
                        ),1,1,'')
)IndexColumns
OUTER APPLY
(
        SELECT ix_included_column_name
               = STUFF((
                        SELECT ',' + column_name
                          FROM tx AS b
                         WHERE schema_name = a.schema_name
                           AND table_name=a.table_name
                           AND ix_name=a.ix_name
                           AND ix_type_desc=a.ix_type_desc
                           AND fg_name=a.fg_name
                           AND is_included_column=1
                         ORDER BY index_column_id
                           FOR XML PATH('')
                        ), 1,1,'')
)IncludeIndex
ORDER BY a.schema_name,a.table_name,a.ix_name;
/****临时表#tmptb1增加ID项****/
alter table #tmptb1 add id int identity(1,1);
/****先删除所有主键与索引****/
set @i=1
while @i<=(select Max(id) from #tmptb1)
begin
	select @tbName=table_name,@SqlStr1=Drop_Index from #tmptb1 where id=@i
	print '删除所有主键与索引:'+@tbName
	if @SqlStr1<>''
		exec(@SqlStr1)

	set @i=@i+1
end;
/****获取默认值约束及更改字段类型语句****/
SELECT d.Name as tbName,'DF_'+d.name+'_'+a.name as DFName,
	case when ISNULL(SM.text,'')<>'' then 
	'alter table '+d.name+' drop constraint '+(select f.name from syscolumns e,sysobjects f where e.id=object_id(d.name) and f.id=e.cdefault and e.name=a.name and f.name like 'DF%')
	else '' end as 删除约束,
	'alter table ['+d.name+'] alter column ['+a.name+'] n'+b.name+'('+cast((case when a.length>4000 then 4000 else a.length end) as varchar)+')'+case when a.IsNullable = 0 then ' NOT NULL' else '' end as 更新字段,
	case when ISNULL(SM.text,'')<>'' then 'if not exists(select f.name from syscolumns e,sysobjects f '
	+'where e.id=object_id('''+d.name+''') and f.id=e.cdefault and f.name=''DF_'+d.name+'_'+a.name+''') '
	+'ALTER TABLE '+d.name+' ADD CONSTRAINT DF_'+d.name+'_'+a.name
	+' DEFAULT '+ISNULL(SM.text,'')+' FOR '+a.name else '' end as 增加默认值 into #tmptb2
FROM syscolumns a
left join systypes b on a.xtype=b.xusertype
LEFT JOIN dbo.syscomments SM ON a.cdefault = SM.id
inner join sysobjects d on a.id=d.id  and d.xtype='U' and  d.name<>'dtproperties'
where d.name = @tablename and a.name = @column 
and b.name in('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.name;

/****临时表#tmptb2增加ID项****/
alter table #tmptb2 add id int identity(1,1);
/****删除默认值约束,更新字段,重新创建默认值****/
set @i=1;
while @i<=(select Max(id) from #tmptb2)
begin
	select @tbName=tbName,@DFName=DFName,@SqlStr1=删除约束,@SqlStr2=更新字段,@SqlStr3=增加默认值 from #tmptb2 where id=@i;
	print '删除默认值约束,更新字段,重新创建默认值:'+@tbName+' | '+@DFName;
	--begin tran
	exec('alter table ['+@tbname+'] nocheck constraint all');
	if @SqlStr1<>''
		exec(@SqlStr1);
	if @SqlStr2<>''
		exec(@SqlStr2);
	if @SqlStr3<>''
		exec(@SqlStr3);
	exec('alter table ['+@tbname+'] check constraint all');

	set @i=@i+1;
end;
/****重键主键及索引****/
set @i=1;
while @i<=(select Max(id) from #tmptb1)
begin
	select @tbName=table_name,@SqlStr1=Create_Index from #tmptb1 where id=@i;
	print '重键主键及索引:'+@tbName;
	--begin tran
	--exec('alter table ['+@tbname+'] nocheck constraint all')
	if @SqlStr1<>''
		exec(@SqlStr1);
	--exec('alter table ['+@tbname+'] check constraint all')

	set @i=@i+1;
end;
/*
if @@error>0
begin
	rollback tran
end else
begin
	commit tran
end
*/
/****删除临时表****/
drop table #tmptb1;
drop table #tmptb2;

发布了90 篇原创文章 · 获赞 33 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/y281252548/article/details/102517698