䶮字 在数据库中 必须 用 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;