From 5f67f27b75dc3094cc84d048beb3668d3186eae4 Mon Sep 17 00:00:00 2001 From: xiaochanghai Date: Fri, 8 Nov 2024 17:30:29 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E8=A1=A8=E5=B7=AE=E5=BC=82=E8=84=9A=E6=9C=AC=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Model/Tiobon.Web.pdm | 6 +- .../Controllers/CommonController.cs | 191 ++++++++++++------ 2 files changed, 130 insertions(+), 67 deletions(-) diff --git a/Model/Tiobon.Web.pdm b/Model/Tiobon.Web.pdm index 9ad5e2eb..3b429ccc 100644 --- a/Model/Tiobon.Web.pdm +++ b/Model/Tiobon.Web.pdm @@ -1,5 +1,5 @@ - + @@ -26729,11 +26729,11 @@ LABL 0 Arial Unicode MS,8,N 11CD542D-061E-4B85-A96B-7A0543F3C4AE -岗位ID1 +岗位 TitleId 1721353940 Administrator -1730947751 +1730947816 Administrator 岗位ID nvarchar(2000) diff --git a/Tiobon.Core.Api/Controllers/CommonController.cs b/Tiobon.Core.Api/Controllers/CommonController.cs index 77b979dd..68854d54 100644 --- a/Tiobon.Core.Api/Controllers/CommonController.cs +++ b/Tiobon.Core.Api/Controllers/CommonController.cs @@ -191,7 +191,9 @@ public class CommonController : BaseApiController D.IS_NULLABLE, D.data_type COLUMN_TYPE, E.name AS ConstraintName, - E.definition AS COLUMN_DEFAULT + E.definition AS COLUMN_DEFAULT, + A.object_id, + B.object_id FROM sys.columns A LEFT JOIN sys.tables B ON A.object_id = B.object_id LEFT JOIN sys.extended_properties C @@ -200,7 +202,8 @@ FROM sys.columns A ON D.column_name = A.name AND D.TABLE_NAME = B.[name] LEFT JOIN sys.default_constraints E ON E.parent_object_id = A.object_id - AND E.parent_column_id = A.column_id"; + AND E.parent_column_id = A.column_id +WHERE B.name IS NOT NULL"; #region step 1.1 加载表结构 // 源数据库 @@ -220,7 +223,7 @@ FROM sys.columns A //CharacterSet = o.Field("CHARACTER_SET_NAME") }) .ToList(); - Console.WriteLine("", $"加载源数据库[hdis_compare]信息完毕:共有表{srcCloumns.Select(o => o.TableName).Distinct().Count()} 字段 {srcCloumns.Count}"); + Console.WriteLine("", $"加载源数据库[hdis_compare]信息完毕:共有表{srcCloumns.Select(o => o.TableName).Distinct().Count()} 字段 {srcCloumns.Count}"); // 目标数据库 dt = DBServerProvider.GetSqlDapper("defalut1").GetDataTable(sql); @@ -330,10 +333,10 @@ FROM sys.columns A var dExcept = desrcCloumns.Except(srcCloumns, new CompareStructureCloumnComparer()).ToList(); var except = new List(); dExcept.ForEach(o => - { + { bool has = false; sExcept.ForEach(p => - { + { //具有相同的两个重复记录 if (o.TableName == p.TableName && o.ColumnName == p.ColumnName) { @@ -352,12 +355,12 @@ FROM sys.columns A { Console.WriteLine("", "数据结构完全一致"); return Ok("数据结构完全一致"); - } + } #endregion #region 2.2 生成需要创建的表 bool b_hasConetnt = false; - sb.AppendLine("SET FOREIGN_KEY_CHECKS = 0;\r\n"); + //sb.AppendLine("SET FOREIGN_KEY_CHECKS = 0;\r\n"); var temp = except.Select(o => o.TableName).Distinct(); Console.WriteLine("", $"字段不同数量为 {except.Count}"); var sTempNames = srcCloumns.Select(o => o.TableName); @@ -371,54 +374,98 @@ FROM sys.columns A { string sql1 = @$"DECLARE @TableName NVARCHAR(128) = '{tname}'; -DECLARE @SQL NVARCHAR(MAX); +DECLARE @SQL NVARCHAR (MAX); -- 获取表的创建语句 -SET @SQL = 'CREATE TABLE ' + @TableName + ' (' + CHAR(13) + CHAR(10); +SET @SQL = 'CREATE TABLE ' + @TableName + ' (' + CHAR (13) + CHAR (10); -- 获取列信息 -SELECT @SQL = @SQL + - ' ' + c.name + ' ' + - t.name + - CASE - WHEN t.name IN ('nvarchar', 'varchar', 'char', 'nchar') THEN '(' + CAST(c.max_length AS NVARCHAR(10)) + ')' - WHEN t.name IN ('decimal', 'numeric') THEN '(' + CAST(c.precision AS NVARCHAR(10)) + ', ' + CAST(c.scale AS NVARCHAR(10)) + ')' - ELSE '' - END + - CASE - WHEN c.is_nullable = 0 THEN ' NOT NULL' - ELSE ' NULL' - END + - CASE - WHEN ep.value IS NOT NULL THEN ' -- ' + CAST(ep.value AS NVARCHAR(MAX)) - ELSE '' - END + ',' + CHAR(13) + CHAR(10) -FROM - sys.columns c -INNER JOIN - sys.types t ON c.user_type_id = t.user_type_id -LEFT JOIN - sys.extended_properties ep ON ep.major_id = c.object_id AND ep.minor_id = c.column_id AND ep.class = 1 -WHERE - c.object_id = OBJECT_ID(@TableName); +SELECT @SQL = + @SQL + + ' ' + + c.name + + ' ' + + t.name + + CASE + WHEN t.name IN ('nvarchar', + 'varchar', + 'char', + 'nchar') + THEN + '(' + + CASE + WHEN c.max_length = -1 THEN 'max' + ELSE CAST (c.max_length AS NVARCHAR (10)) + END + + ')' + WHEN t.name IN ('decimal', 'numeric') + THEN + '(' + + CAST (c.precision AS NVARCHAR (10)) + + ', ' + + CAST (c.scale AS NVARCHAR (10)) + + ')' + ELSE + '' + END + + CASE WHEN c.is_nullable = 0 THEN ' NOT NULL' ELSE ' NULL' END + + CASE + WHEN E.definition IS NOT NULL + THEN + ' default ' + + REPLACE + ( + REPLACE + (CAST (E.definition AS NVARCHAR (MAX)), ')', ''), + '(', + '') + ELSE + '' + END + + ',' + + CASE + WHEN ep.value IS NOT NULL + THEN + ' -- ' + CAST (ep.value AS NVARCHAR (MAX)) + ELSE + '' + END + + CHAR (13) + + CHAR (10) +FROM sys.columns c + INNER JOIN sys.types t ON c.user_type_id = t.user_type_id + LEFT JOIN sys.extended_properties ep + ON ep.major_id = c.object_id + AND ep.minor_id = c.column_id + AND ep.class = 1 + LEFT JOIN sys.default_constraints E + ON E.parent_object_id = c.object_id + AND E.parent_column_id = c.column_id +WHERE c.object_id = OBJECT_ID (@TableName); -- 移除最后一个逗号 -SET @SQL = LEFT(@SQL, LEN(@SQL) - 2); +SET @SQL = LEFT (@SQL, LEN (@SQL) - 2); -- 添加主键信息 -SELECT @SQL = @SQL + CHAR(13) + CHAR(10) + - ' CONSTRAINT PK_' + @TableName + ' PRIMARY KEY (' + - COL_NAME(ic.object_id, ic.column_id) + ')' + CHAR(13) + CHAR(10) + - ')' -FROM - sys.indexes i -INNER JOIN - sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id -WHERE - i.object_id = OBJECT_ID(@TableName) AND i.is_primary_key = 1; +SELECT @SQL = + @SQL + + CHAR (13) + + CHAR (10) + + ' CONSTRAINT PK_' + + @TableName + + ' PRIMARY KEY (' + + COL_NAME (ic.object_id, ic.column_id) + + ')' + + CHAR (13) + + CHAR (10) + + ')' +FROM sys.indexes i + INNER JOIN sys.index_columns ic + ON i.object_id = ic.object_id AND i.index_id = ic.index_id +WHERE i.object_id = OBJECT_ID (@TableName) AND i.is_primary_key = 1; -- 输出生成的 SQL 语句 -select @SQL SQL ;"; +SELECT @SQL SQL;"; DataTable ds = DbAccess.GetDataTable(sql1); if (ds.Rows.Count > 0) { @@ -433,7 +480,7 @@ select @SQL SQL ;"; }); Console.WriteLine("", $"生成需要创建的表完毕"); } - + #endregion #region 2.3 生成需要删除的表 @@ -444,12 +491,12 @@ select @SQL SQL ;"; deleteTablesNames.ForEach(tname => { b_hasConetnt = true; - sb.AppendLine($"DROP TABLE `{tname}`;\r\n"); + sb.AppendLine($"DROP TABLE {tname};\r\n"); Console.WriteLine("", $"生成表[{tname}]删除语句"); }); Console.WriteLine("", $"生成需要删除的表完毕"); } - + #endregion #region 2.4 生成需要修改的表 @@ -470,7 +517,7 @@ select @SQL SQL ;"; //sb.AppendLine($"ALTER TABLE `hdis`.`{t.TableName}`" + // $" ADD COLUMN `{t.ColumnName}` {t.DataType}{GetCharacter_Set_Name(t.CharacterSet)}{GetCollate(t.Collsion)}{GetNull(t.Null)}{GetDefaultValue(t.DefaultValue, t.DataType)};\r\n"); - sb.AppendLine($"ALTER TABLE [{t.TableName}] ADD [{t.ColumnName}] {t.DataType} NULL"); + sb.AppendLine($"ALTER TABLE [{t.TableName}] ADD [{t.ColumnName}] {t.DataType} NULL;\r\n"); //ALTER TABLE[dbo].[Ghre_StudyRule] ADD[Column_42] int NOT NULL DEFAULT 1 }); #endregion @@ -492,24 +539,40 @@ select @SQL SQL ;"; //if (!string.IsNullOrEmpty(forignKey)) sb.AppendLine(forignKey); //if (!string.IsNullOrEmpty(indexs)) sb.AppendLine(indexs); - sb.AppendLine($"ALTER TABLE [dbo].[`{t.TableName}`] DROP COLUMN `{t.ColumnName}`;\r\n"); + sb.AppendLine($"ALTER TABLE [{t.TableName}] DROP COLUMN {t.ColumnName};\r\n"); //ALTER TABLE [dbo].[Ghre_StudyRule] DROP COLUMN [IsDeptLower] deletedColumns.Add((t.TableName, t.ColumnName)); }); #endregion #region 2.4.3 修改列语句 - //except - //.Where(t => t.TableName == o && srcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName) - // && desrcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName)) - // .ToList() - //.ForEach(t => - //{ - // b_hasConetnt = true; - // string renovate = RenovateNotNull("hdis", t.TableName, t.ColumnName, t.Null, t.DefaultValue, t.DataType); - // sb.AppendLine(renovate); - // sb.AppendLine($"ALTER TABLE `hdis`.`{t.TableName}` CHANGE `{t.ColumnName}` `{t.ColumnName}` {t.DataType}{GetCharacter_Set_Name(t.CharacterSet)}{GetCollate(t.Collsion)}{GetNull(t.Null)}{GetDefaultValue(t.DefaultValue, t.DataType)};\r\n"); - //}); + except + .Where(t => t.TableName == o && srcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName) + && desrcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName)) + .ToList() + .ForEach(t => + { + b_hasConetnt = true; + + var old = desrcCloumns.Where(x => x.TableName == t.TableName && x.ColumnName == t.ColumnName).FirstOrDefault(); + + if (old != null && old.DataType != t.DataType) + { + if (t.DataType == "varchar") + { + sb.AppendLine($"ALTER TABLE [dbo].[{t.TableName}]"); + sb.AppendLine($"ALTER COLUMN [{t.ColumnName}] {t.DataType} COLLATE Chinese_PRC_CI_AS;\r\n"); + }else if (t.DataType == "date" || t.DataType == "datetime" || t.DataType == "datet"|| t.DataType == "bigint" || t.DataType == "int") + { + sb.AppendLine($"ALTER TABLE [dbo].[{t.TableName}]"); + sb.AppendLine($"ALTER COLUMN [{t.ColumnName}] {t.DataType};\r\n"); + } + } + + //string renovate = RenovateNotNull("hdis", t.TableName, t.ColumnName, t.Null, t.DefaultValue, t.DataType); + //sb.AppendLine(renovate); + //sb.AppendLine($"ALTER TABLE `hdis`.`{t.TableName}` CHANGE `{t.ColumnName}` `{t.ColumnName}` {t.DataType}{GetCharacter_Set_Name(t.CharacterSet)}{GetCollate(t.Collsion)}{GetNull(t.Null)}{GetDefaultValue(t.DefaultValue, t.DataType)};\r\n"); + }); #endregion }); Console.WriteLine("", $"生成需要删除的表完毕"); @@ -518,7 +581,7 @@ select @SQL SQL ;"; { Console.WriteLine("", $"没有需要修改的表"); } - + #endregion #region 2.5 外键 @@ -659,9 +722,9 @@ select @SQL SQL ;"; #endregion //sb.AppendLine("SET FOREIGN_KEY_CHECKS = 1;\r\n"); - + if (b_hasConetnt) - { + { Console.WriteLine("", "比较数据库结构完毕"); } else