表数据同步

表数据字段同步

需求:实现新旧数据库表字段及类型的同步
设计思路:

  • 1.如表:a,查询新旧数据库此表的字段及类型及长度;
  • 2.比对新旧两个表的差集字段;
  • 3.向新表中插入字段;

关键sql脚本

查询所有表名称
select t.name as tableName from sys.tables t left join sys.schemas s on t.schema_id=s.schema_id order by tableName asc

获取指定表所有字段名、数据类型、长度
SELECT syscolumns.name AS 字段名,systypes.name AS 数据类型,syscolumns.length AS 长度 FROM syscolumns INNER JOIN systypes ON systypes.xtype=syscolumns.xtype WHERE id=(SELECT id FROM sysobjects WHERE name='{0}')

数据库表添加字段属性
alter table NewDB add property1 varchar(30), property2 varchar(30);

控制台实例代码
点击查看代码
using DemoSqlServer.Helpers;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace DemoSqlServer
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            ConnForSQL connForSQL = new ConnForSQL(".", "AJDB", "sa", "sa123");
            ConnForSQL connForSQLNew = new ConnForSQL(".", "AJDBNew", "sa", "sa123");

            DataTable tableNameTable = new DataTable();

            //string getAllTableNameSql = "select concat(s.name ,concat('.',t.name)) as tableName from sys.tables t left join sys.schemas s on t.schema_id=s.schema_id order by tableName asc;";

            //获取数据库所有表名称
            string getAllTableNameSql = "select t.name as tableName from sys.tables t left join sys.schemas s on t.schema_id=s.schema_id order by tableName asc;";

            var dataSet = connForSQL.ReturnDataSet(getAllTableNameSql);
            var dataSetNew = connForSQLNew.ReturnDataSet(getAllTableNameSql);

            List<string> tableNameList = new List<string>();
            List<string> tableNameListNew = new List<string>();

            //表名集合
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                tableNameList.Add(dataSet.Tables[0].Rows[i][0].ToString());
            }

            for (int i = 0; i < dataSetNew.Tables[0].Rows.Count; i++)
            {
                tableNameListNew.Add(dataSetNew.Tables[0].Rows[i][0].ToString());
            }

            //获取字段信息
            string getFieldInfoSql = "SELECT syscolumns.name AS 字段名,systypes.name AS 数据类型,syscolumns.length AS 长度 FROM syscolumns INNER JOIN systypes ON systypes.xtype=syscolumns.xtype WHERE id=(SELECT id FROM sysobjects WHERE  name='{0}')";

            List<string> targetFieldList = new List<string>();

            for (int i = 0; i < tableNameListNew.Count; i++)
            {
                var t = tableNameListNew[i];
                string sql = string.Format(getFieldInfoSql, tableNameListNew[i]);
                var fieldInfoTable = connForSQLNew.ReturnDataSet(sql).Tables[0];

                targetFieldList.Clear();

                for (int j = 0; j < fieldInfoTable.Rows.Count; j++)
                {
                    var a = fieldInfoTable.Rows[j][0];//TestId
                    var b = fieldInfoTable.Rows[j][1];//varchar
                    var c = fieldInfoTable.Rows[j][2];//50

                    targetFieldList.Add(a + "@" + b + "(" + c + ")");
                }
            }

            List<string> sourceFieldList = new List<string>();

            for (int i = 0; i < tableNameList.Count; i++)
            {
                var t = tableNameList[i];

                if (t.Equals("Dic_Employee"))
                {
                    string sql = string.Format(getFieldInfoSql, tableNameList[i]);
                    var fieldInfoTable = connForSQL.ReturnDataSet(sql).Tables[0];

                    sourceFieldList.Clear();

                    for (int j = 0; j < fieldInfoTable.Rows.Count; j++)
                    {
                        var a = fieldInfoTable.Rows[j][0];
                        var b = fieldInfoTable.Rows[j][1];
                        var c = fieldInfoTable.Rows[j][2];
                        sourceFieldList.Add(a + "@" + b + "(" + c + ")");
                    }
                }
            }

            List<string> differenceSetList = new List<string>();

            differenceSetList = sourceFieldList.Except(targetFieldList).ToList();
            /*******************************
           alter table NewVehicleInformation add
kssj_NQ varchar(30),
jssj_NQ varchar(30);
             * *********************/
            if (differenceSetList.Count > 0)
            {
                string sql = " alter table Dic_Employee add ";

                for (int i = 0; i < differenceSetList.Count; i++)
                {
                    var fieldArr = differenceSetList[i].Split('@');
                    var a = fieldArr[0];
                    var b = fieldArr[1];
                    if (i.Equals(differenceSetList.Count - 1))
                    {
                        sql += a + " " + b + ";";
                    }
                    else
                    {
                        sql += a + " " + b + ",";
                    }
                }

                int nSuccessLine = connForSQLNew.ExecuteSQL(sql);
                Console.WriteLine("执行成功行数:" + nSuccessLine);
            }
            else
            {
                Console.WriteLine("数据表无差异!!!");
            }

            Console.ReadKey();
        }
    }
}
posted @ 2022-06-24 16:57  弗里德里希恩格hao  阅读(46)  评论(1编辑  收藏  举报