Sql-Server

如何比較兩個數據庫的架構?

  • February 13, 2021

有沒有辦法找到兩個 SQL Server 數據庫中的差異(僅限模式)。一個是本地的,第二個是在客戶的站點。我們在執行一些報表和一些程式碼未執行的水晶報表時遇到問題,並且模式似乎不匹配。

我可以在兩個數據庫上執行相同的命令並比較結果以判斷差異在哪裡嗎?

如果由於連接問題而無法使用眾多工具之一併希望進行“離線”比較,則可以使用 SSMS 通過右鍵點擊數據庫並使用“任務…/生成”為所有數據庫對像生成腳本Scripts”功能,並確保您選擇為每個對象創建一個文件。

當您對兩個數據庫都完成了此操作後,將兩組腳本放到本地電腦上的兩個單獨文件夾中,然後使用 WinMerge(或類似工具)比較兩者。

在嘗試了一種簡單的方法來完成同樣的任務之後——看看兩個模型之間發生了什麼變化,我編寫了下面的 SQL 腳本,它將比較兩個模式以確定新的和刪除的列

set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script

declare @newmodel varchar(50), @oldmodel varchar(50);

Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';


Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));

Declare @script varchar(5000);


set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''), 
       IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
   from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
       LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc 
           on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
   Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
   from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
   where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME) 
       not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';


Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);

--print @script

Insert into @Temp
   exec(@script);

Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go

引用自:https://dba.stackexchange.com/questions/95236