【C#】使用C#快速将varchar全部修改为nvarchar

前言:

由于项目之前的设计缺陷,就是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
喜欢就支持一下吧
点赞0 分享