2012-11-22 17 views
5

要件に基づいてマスタテーブルに列を追加するために、2つの異なるデータベースの異なるテーブルの列を比較する必要があります。例えば2つの異なるデータベースから2つの異なるテーブルの列を比較します。

私は以下のように一つのテーブルを作成したマスター・データベースに想定:私は

create table testings(id int,name varchar(20), sal int) 

のように一つのテーブルを作成したテスト・データベースに想定

create table test(id int,name varchar(10)) 

今私がする必要がありますテーブル2列を比較する

私はレッドゲートツールを使いたくありません。

誰でも手伝ってもらえますか?

答えて

8

これには、EXCEPT or INTERSECTセット演算子を使用できます。これと同じように:

SELECT id, name FROM master.dbo.test 
EXCEPT -- or INTERSECT 
SELECT id, name FROM test.dbo.testings 

これはあなたを与える:

  • EXCEPT:戻っても、右のクエリには見られない され、左のクエリからのすべての個別の値。

  • INTERSECT:戻りINTERSECTオペランドの左右に クエリの両方によって返される任意の個別の値。あなたは2つの異なるデータベースから選択するようにしたいので、あなたの場合は

、あなたは、完全修飾テーブル名を使用する必要があります。彼らは形にする必要がありますdatabase.schema.object_name

更新: 2つのテーブルの列を比較したい場合はEXCEPTと同じように名前の名前ではなく、データそのものを、あなたが列を比較するためにメタデータ表と仕事をしなければならないと。例えば

、あなたは2つのデータベースを持っているとします

  • Testデータベースにはテーブルが含まれています

    create table test(id int, name varchar(10), dep varchar(50)); 
    

    と別のデータベース:

  • anotherdatabaseデータベースが含まれていますテーブル:

    create table testings(id int,name varchar(20), sal int); 
    

そして、あなたは二つのテーブル列を比較し、他のテーブルに存在しないテーブルを取得したいが、私たちの例では、あなたはsaldepを取得する必要があります。

次にあなたがこれを行うことができます:

SELECT ColumnName 
FROM 
(
    SELECT c.name "ColumnName" 
    FROM test.sys.tables t 
    INNER JOIN test.sys.all_columns c 
      ON t.object_id = c.object_id 
    INNER JOIN test.sys.types ty 
      ON c.system_type_id = ty.system_type_id 
    WHERE t.name = 'test' 
    EXCEPT 
    SELECT c.name 
    FROM anotherdatabase.sys.tables t 
    INNER JOIN anotherdatabase.sys.all_columns c 
      ON t.object_id = c.object_id 
    INNER JOIN anotherdatabase.sys.types ty 
      ON c.system_type_id = ty.system_type_id 
    WHERE t.name = 'testings' 
) t1 
UNION ALL 
SELECT ColumnName 
FROM 
(
    SELECT c.name ColumnName 
    FROM anotherdatabase.sys.tables t 
    INNER JOIN anotherdatabase.sys.all_columns c 
      ON t.object_id = c.object_id 
    INNER JOIN anotherdatabase.sys.types ty  
      ON c.system_type_id = ty.system_type_id 
    WHERE t.name = 'testings' 
    EXCEPT 
    SELECT c.name 
    FROM test.sys.tables t 
    INNER JOIN test.sys.all_columns c 
      ON t.object_id = c.object_id 
    INNER JOIN test.sys.types ty 
      ON c.system_type_id = ty.system_type_id 
    WHERE t.name = 'test' 
) t2; 

をこれはあなたを与える必要があります。私は、テーブルに入社:

enter image description here

注こと

同じデータ型を持つ列のみを取得します。この表に結合しなかった場合、2つの列が同じ名前でデータ型が異なる場合、同じ列になります。

+0

こんにちはMahmoud Gamel、返事をくれてありがとう、いつも設定されている演算子は、列賢明ではなく行優先で働くことを忘れないでください。私の要件は、私は2つのテーブルの列を比較する必要があります任意のテーブルは、私はその列の名前を識別するために私はそれを追加する必要がある別のものより少ない列を持っている場合。私は立っている下であなたが望む。 – Franklin

+0

@ user1694000 - ご迷惑をおかけして申し訳ありません。だから、あなたはそれらのどれにも存在しない列名を得たいと思う。右?ちょうどカラム名。 –

+0

@ user1694000 - 私の編集を参照してください。 –

1

列を比較するには、SQL SERVERのINFORMATION_SCHEMA.COLUMNSテーブルを使用します。

これはexmapleです:

select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='your_table_name1' 
except 
select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='your_table_name2' 
11

はそれだけで赤ゲートツールです、あなたが任意のサードパーティ製のツールを使用するか、基本的にはしたくないですか?なぜ、たとえあなたが購入する予算を持っていなくても、試しにこれを使って仕事を終えることができますか?

私たちはApex Diffツールを使用していますが、そこにはさらに多くのものがあります。利用できるように多くのツールを使用

あなたはおそらくヶ月間の試用モードで1によって全てのいずれかを実行することができます...

...システムテーブルを知り、どのようにこれを行うには、ネイティブに素晴らしいですが、それはあまりにも時間がかかるのです

関連する問題