批量替換數據庫中所有用戶數據表中字段數據類型爲char和varchar到nvarchar的腳本

解決問題:字段類型爲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 --刪除遊標

 

 

發佈了300 篇原創文章 · 獲贊 99 · 訪問量 154萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章