我试图通过这个步骤来解决这个问题,我希望这个答案对你有所帮助。
1- 通过此过程捕获 DB2 中的所有列。
USE [LastDatabase]
GO
/****** Object: StoredProcedure [dbo].[CaptureMyColumns] Script Date: 01/10/2022 05:33:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create proc [dbo].[CaptureMyColumns]
as
IF OBJECT_ID(N'dbo.LastColumns', N'U') IS NOT NULL
begin
DROP TABLE [dbo].[LastColumns];
SELECT ROW_NUMBER() OVER (
ORDER BY T.name
) id, T.name AS Table_Name ,
C.name AS Column_Name ,
P.name AS Data_Type ,
c.collation_name ,
p.is_nullable ,
c.max_length,object_definition(c.default_object_id)[defaultValue],c.is_identity
into newcolumns
FROM sys.objects AS T
JOIN sys.columns AS C ON T.object_id = C.object_id
JOIN sys.types AS P ON C.system_type_id = P.system_type_id
WHERE T.type_desc = 'USER_TABLE' and p.name <> 'sysname'
end
else
begin
SELECT ROW_NUMBER() OVER (
ORDER BY T.name
) id, T.name AS Table_Name ,
C.name AS Column_Name ,
P.name AS Data_Type ,
c.collation_name ,## Heading ##
p.is_nullable ,
c.max_length,object_definition(c.default_object_id)[defaultValue],c.is_identity
FROM sys.objects AS T
JOIN sys.columns AS*strong text* C ON T.object_id = C.object_id
JOIN sys.types AS P ON C.system_type_id = P.system_type_id
WHERE T.type_desc = 'USER_TABLE' and p.name <> 'sysname'
end
GO
2- 仅生成脚本 从 DB2 [新数据库] 检查此表 [LastColumns](架构和数据)并在 DB1(旧数据库)中执行此脚本
根据您的数据库 [最后一个数据库],脚本将是这样的
CREATE TABLE [dbo].[Lastcolumns](
[id] [bigint] NULL,
[Table_Name] [sysname] NOT NULL,
[Column_Name] [sysname] NULL,
[Data_Type] [sysname] NOT NULL,
[collation_name] [sysname] NULL,
[is_nullable] [bit] NULL,
[max_length] [smallint] NOT NULL,
[defaultValue] [nvarchar](max) NULL,
[is_identity] [bit] NOT NULL
) 开启 [主要]
去吧
插入 [dbo].[newcolumns]([id]、[Table_Name]、[Column_Name]、[Data_Type]、[collation_name]、[is_nullable]、[max_length]、[defaultValue]、[is_identity])值( 1, N'accounts', N'id', N'int', NULL, 1, 4, NULL, 1)
3 - 在数据库中升级
右键单击您上次更新的数据库并生成脚本:
不要忘记如果不存在选项:
3 - 现在,如果此脚本在旧数据库中找不到列,您可以添加列
DECLARE @Counter INT
SET @Counter=1
DECLARE @Counter2 INT
SET @Counter2=1
DECLARE @tbCount INT=(select COUNT(0) from newColumns )
WHILE ( @Counter <= @tbCount)
BEGIN
declare @tb_name nvarchar(50)=(select table_name from newColumns where id=@counter);
declare @col_name nvarchar(50)=(select column_name from newColumns where id=@counter);
declare @col_typ nvarchar(50)=(select
case when data_type='nvarchar' then 'nvarchar('+convert(nvarchar(50),max_length)+')'
when data_type='char' then 'char('+convert(nvarchar(50),max_length)+')'
else data_type end [ee]
from newColumns where id=@counter);
declare @nu nvarchar(50)=(select case when is_nullable='False' then 'not null default ' else 'null' end [es] from newColumns where id=@counter);
declare @defaultValue nvarchar(50)=(select defaultValue from newColumns where id=@counter);
IF not EXISTS (
SELECT *
FROM sys.columns
WHERE object_id = OBJECT_ID(N'[dbo].['+@tb_name+']')
AND name = @col_name
)
BEGIN
exec ( 'ALTER TABLE '+@tb_name+' ADD '+@col_name+' '+
@col_typ +' '+ @nu +' '+ @defaultValue +';')
print ( 'ALTER TABLE '+@tb_name+' ADD '+@col_name+' '+
@col_typ +' '+ @nu +' '+ @defaultValue +';')
SET @Counter2 = @Counter2 + 1
END
SET @Counter = @Counter + 1
END
print 'End Of Loop'
4 - 最后通过从 Last DB 生成脚本并在旧 DB 中执行来删除和创建所有视图和函数
检查除表格之外的所有内容:
删除并创建:
========================
这可能不是完美的方法,但它通常可以有效地帮助我
谢谢,