解決問題:字段類型爲char的總是佔用指定字節長度(末尾好多空白符號),varchar數據類型長度一個漢字佔2個字節,內容存儲爲中文的字段個人建議全部使用nvarchar。
操作說明:打開SQL Server Management Studio,選中你要更新字段類型的數據庫,點新建查詢菜單,執行下面的語句即可。
詳細代碼:
--批量替換數據庫中所有用戶數據表中字段數據類型爲char和varchar到nvarchar的腳本
declare @TableName nvarchar(255) --定義數據表名變量
declare @ColumnName nvarchar(255) --定義字段名處變量
declare @ConstraintName varchar (250)--定義當前查詢的約束變量
declare @cllength nvarchar(8) --定義字段長度變量
declare @tyname nvarchar(255) --定義字段類型變量
declare @Sql nvarchar(2000) --定義循環執行SQL語句
declare mycursor1 cursor fast_forward for select a.name as tbname,b.name as clname, b.prec as cllength, c.name as tpname from sysobjects a inner join syscolumns b on b.id=a.id and a.type='U' inner join systypes c on b.xusertype=c.xusertype where a.xtype='U' and (c.name='char' or c.name='nchar') --定義一個遊標對象
open mycursor1 --打開遊標
fetch next from mycursor1 into @TableName,@ColumnName,@cllength,@tyname--取數據到臨時變量
while @@fetch_status = 0 --系統@@fetch_status = 0 時循環結束
begin
--1刪除指定數據表指定字段對應的所有約束
--聲明讀取數據表中指定字段對應的所有約束列表遊標
declare mycursor2 cursor for select name from sysobjects left join sysconstraints on sysconstraints.constid=sysobjects.id where parent_obj=OBJECT_ID(''+@TableName+'') and colid=(select colid from syscolumns where id=OBJECT_ID(''+@TableName+'') and OBJECTPROPERTY(id, N'IsUserTable') = 1 and upper(name)=upper(@ColumnName))
--打開遊標
open mycursor2
--從遊標裏取出數據賦值到主鍵約束名稱變量中
fetch next from mycursor2 into @ConstraintName
--如果遊標執行成功
while (@@fetch_status=0)
begin
--刪除當前找到的約束
print '當前刪除語句'+'ALTER TABLE ['+@TableName+'] DROP CONSTRAINT ['+@ConstraintName+']'
exec ('ALTER TABLE ['+@TableName+'] DROP CONSTRAINT ['+@ConstraintName+']')
--print '已成功刪除數據表['+@TableName+']字段['+@ColumnName+']對應的約束['+@ConstraintName+']'
--用遊標去取下一條記錄
fetch next from mycursor2 into @ConstraintName
end
--關閉遊標
close mycursor2
--撤銷遊標
deallocate mycursor2
--2循環執行更新字段語句
set @Sql = 'alter table ['+@TableName+'] alter column ['+ @ColumnName +'] nvarchar('+@cllength+');'--定義當前更新字段類型執行語句
execute(@Sql);
print '當更新語句'+@Sql
fetch next from mycursor1 into @TableName,@ColumnName,@cllength,@tyname --再次取值
end
close mycursor1 --關閉遊標
deallocate mycursor1 --刪除遊標