|
|
|
@ -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 加载表结构 |
|
|
|
|
// 源数据库 |
|
|
|
@ -357,7 +360,7 @@ FROM sys.columns A |
|
|
|
|
|
|
|
|
|
#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) |
|
|
|
|
{ |
|
|
|
@ -444,7 +491,7 @@ 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("", $"生成需要删除的表完毕"); |
|
|
|
@ -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("", $"生成需要删除的表完毕"); |
|
|
|
|