自動的に2台の異なるサーバーで古いものと新しいデータベース・テーブルの構造の違いを確認するために古いものと新しいSQLのSQL Serverデータベースサーバ、汎用スクリプト内のテーブル構造の相違を書きます

質問:
仕事に関係なく、プロジェクトエスカレートバージョンと一緒にプロジェクトは、対応するプロジェクトデータベースビジネス版もエスカレートされたものを、データベーステーブルがなど、フィールドを削除、追加、テーブルを変更し、テーブルを削除、フィールドの追加、フィールドを変更するように見えます手動検査、データベースのテーブルとフィールドがケースであれば変更は、作業負荷が非常に大きいです。

ソリューション:
汎用スクリプトここブロガーだけでリンクサーバーを介してクロスチェック別のサーバーをサポートすることができますバッチの実際の名前の古いものと新しいデータベース名を交換する必要があり、作業プロセスデータベーステーブルの構造の違いを書かれたバージョンを確認自動的に共有します2つのデータベースのテーブル・サーバとの間の構造の違い。

スクリプト:

コードをコピー
/ * 
    説明:旧データベースDB_V1、新しいデータベース[ローカルホスト] .DB_V2。バッチの実際のニーズに応じて、データベース名の置き換え
    スクリプト出典:HTTPS://www.cnblogs.com/zhang502219048/p/11028767.html 
* / 

-一時表のsysobjectsに挿入
を選択しs.nameテーブル名として+ + t.nameを、 「」 T. * INTO #tempTA 
DB_V1.sys.tables Tから
インナーs.schema_id t.schema_id ON = DB_V1.sys.schemas Sに参加

SELECT s.name + '' +テーブル名AS、T. * INTO #tempTBをt.name 
[ローカルホスト] .DB_V2.sys.tables Tから
インナーs.schema_id t.schema_id ON = [ローカルホスト] .DB_V2.sys.schemas Sに参加

-のsyscolumnsの一時テーブルを挿入
DB_V1.dbo.syscolumnsから#tempCA INTO * SELECT 
SELECT * INTO [ローカルホスト] .DB_V2.dbo.syscolumnsから#tempCB 
 
-最初のデータベーステーブルとフィールド
テーブルAS SELECT b.TableName、タイプ、フィールド名、長さa.length、c.nameとしてa.name
#tempA INTO 
#tempCA Aから
インナーb.object_id a.id ON参加#tempTA B = 
インナーsystypesにに参加C = c.xusertypeのa.xusertypeオン
b.name順
-第二のデータベーステーブルとフィールド
を選択b.TableNameテーブル名、フィールド名としてa.name、長さa.length、タイプとしてc.nameとして
#tempB INTO 
#tempCB Aから
インナーb.object_id a.id ON参加#tempTB B = 
インナーsystypesにに参加C ON c.xusertype a.xusertype = 
b.name順

-削除フィールド
SELECT *から     
    SELECT * #tempAから
    除く
    #tempBからSELECT * 
)A; 

-追加フィールド
SELECT *から     
    SELECT * #tempBから
    除いて
    からSELECT * #tempA
)。

--select * #tempAから
--select * #tempBから

テーブル#tempTA、#tempTB、#tempCA、#tempCB、#tempA、#tempBをドロップ
コードをコピー

古いデータベースDB_V1の例:

新しいデータベースDB_V2の例:

スクリプトの結果:

結論:
いくつかの図の上に見ることができ、差分部品表のフィールドが自動的に検出されたように。

[Reserved注ミョンテキスト出典:https://www.cnblogs.com/zhang502219048/p/11028767.html ]

質問:
仕事に関係なく、プロジェクトエスカレートバージョンと一緒にプロジェクトは、対応するプロジェクトデータベースビジネス版もエスカレートされたものを、データベーステーブルがなど、フィールドを削除、追加、テーブルを変更し、テーブルを削除、フィールドの追加、フィールドを変更するように見えます手動検査、データベースのテーブルとフィールドがケースであれば変更は、作業負荷が非常に大きいです。

ソリューション:
汎用スクリプトここブロガーだけでリンクサーバーを介してクロスチェック別のサーバーをサポートすることができますバッチの実際の名前の古いものと新しいデータベース名を交換する必要があり、作業プロセスデータベーステーブルの構造の違いを書かれたバージョンを確認自動的に共有します2つのデータベースのテーブル・サーバとの間の構造の違い。

スクリプト:

コードをコピー
/*
    使用说明:Old数据库为DB_V1,New数据库为[localhost].DB_V2。根据实际需要批量替换数据库名称
    脚本来源:https://www.cnblogs.com/zhang502219048/p/11028767.html
*/

-- sysobjects插入临时表
select s.name + '.' + t.name as TableName, t.* into #tempTA 
from DB_V1.sys.tables t
inner join DB_V1.sys.schemas s on s.schema_id = t.schema_id

select s.name + '.' + t.name as TableName, t.* into #tempTB 
from [localhost].DB_V2.sys.tables t
inner join [localhost].DB_V2.sys.schemas s on s.schema_id = t.schema_id

-- syscolumns插入临时表
select * into #tempCA from DB_V1.dbo.syscolumns 
select * into #tempCB from [localhost].DB_V2.dbo.syscolumns

-- 第一个数据库表和字段 
select b.TableName as 表名, a.name as 字段名, a.length as 长度, c.name as 类型
into #tempA
from #tempCA a
inner join #tempTA b on b.object_id = a.id
inner join systypes c on c.xusertype = a.xusertype
order by b.name 
-- 第二个数据库表和字段 
select b.TableName as 表名, a.name as 字段名, a.length as 长度, c.name as 类型
into #tempB
from #tempCB a
inner join #tempTB b on b.object_id = a.id
inner join systypes c on c.xusertype = a.xusertype
order by b.name

--删掉的字段
select * from    
( 
    select * from #tempA
    except
    select * from #tempB
) a;

--增加的字段
select * from    
( 
    #tempBから選択* 
    except
    select * from #tempA
)。

--select * #tempAから
--select * #tempBから

テーブル#tempTA、#tempTB、#tempCA、#tempCB、#tempA、#tempBをドロップ
コードをコピー

古いデータベースDB_V1の例:

新しいデータベースDB_V2の例:

スクリプトの結果:

結論:
いくつかの図の上に見ることができ、差分部品表のフィールドが自動的に検出されたように。

[Reserved注ミョンテキスト出典:https://www.cnblogs.com/zhang502219048/p/11028767.html ]

おすすめ

転載: www.cnblogs.com/Leo_wl/p/11069813.html