前言:
由于项目之前的设计缺陷,就是SqlServer数据库存储字符串格式的数据类型都是varchar,导致存储中文英文都没问题,但是现在做西班牙版本的软件,需要存储西班牙文字符,比如这些特殊字符ó,ñ,í,á,¿存储后变为?
所以需要将varchar改为nvarchar,才能存储Unicode字符
由于数据库表太多,一个一个改效率太低,所以只能只用脚本修改
实现
修改字段的数据类型的sql语句
alter table 表名 alter column 列名 nvarchar(长度)
复制代码
但是字段可能存在约束,无法修改成功,所以要先删除约束
如果存在约束,则删除约束
if exists(select * from sysobjects where name='约束名')
alter table 表名 drop constraint 约束名
复制代码
接下来,我们需要获取数据库所有的用户表
select name from sysobjects where xtype = 'U'
复制代码
获取一个表字段名称,字段数据类型,长度,只查询varchar的字段
select syscolumns.name as fieldName ,systypes.name as fieldType,syscolumns.length as leng
from syscolumns inner join systypes on systypes.xtype=syscolumns.xtype
where id=(select id from sysobjects where name='表名') and systypes.name ='varchar'
复制代码
当查询出来的长度为-1时,表示去最大值MAX
C#中的代码
string sqlTables = "select name from sysobjects where xtype = 'U'";
//获取所有用户表
DataTable tables = SqlHelper.ExecuteDataTable(ConnectionString, sqlTables);
for (int i = 0; i < tables.Rows.Count; i++)
{
//表名
string tableName = tables.Rows[i][0].ToString();
string sqlFields = @"select syscolumns.name as fieldName ,systypes.name as fieldType,syscolumns.length as leng
from syscolumns inner join systypes on systypes.xtype=syscolumns.xtype
where id=(select id from sysobjects where name='" + tableName + "') and systypes.name ='varchar' ";
//获取一个表的所有字段的名称,字段数据类型,长度
DataTable fieldInfos = SqlHelper.ExecuteDataTable(ConnectionString, sqlFields);
try
{
for (int j = 0; j < fieldInfos.Rows.Count; j++)
{
string fieldName = fieldInfos.Rows[j][0].ToString();//名称
string fieldType = fieldInfos.Rows[j][1].ToString();//类型
int leng = int.Parse(fieldInfos.Rows[j][2].ToString());//长度
StringBuilder sbFields = new StringBuilder();
string constraintName = "DF_" + tableName + "_" + fieldName;//约束
sbFields.Append(" if exists(select * from sysobjects where name='" + constraintName + "') ");
sbFields.Append(" alter table " + tableName + " drop constraint " + constraintName);
sbFields.Append(" alter table " + tableName + " alter column " + fieldName + " nvarchar(" + (leng == -1 ? "MAX" : (leng * 2).ToString()) + ") ");
SqlHelper.ExecuteNonQuery(ConnectionString, sbFields.ToString());
}
}
catch
{
}
}
复制代码
其中,我的SqlHelper
完成
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END