2012-04-30 18 views
6

私は、同じテーブルのスキーマを2つのデータベース、つまりSQLサーバとmysqlで視覚的に比較する必要があるページに取り組んでいます。インデックスも含める必要があります。SQL ServerのINFORMATION_SCHEMAに相当するクエリ

今mysqlのクエリでは、インデックスと一緒に情報を表示 -

select column_name,column_type,table_name,column_key 
    from INFORMATION_SCHEMA.COLUMNS where table_name = 'tbl_ClientDN' 

しかし、SQL Serverの同じクエリが

select * from INFORMATION_SCHEMA.COLUMNS where table_name = 'tbl_ClientDN' 

はので、私は結果compbineする問い合わせる必要indexes-戻らない -

sp_helpindex 'tbl_ClientDN' 

mssqlクエリでインデックスを表示するcolumn_keyを取得する方法。 提案がありますか?

+2

はレッドゲートSQLは、MySQLの作業を比較していますか?これは、テーブルスキーマを比較するために使用するツールです。 –

+0

+1 @ BrianWhiteさんのコメント。 http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/ –

答えて

8

フィルタリングされたインデックスやインクルードされた列などは定義の一部ではないため、特にインデックスの場合はINFORMATION_SCHEMA.COLUMNSから離れてください。私はここで、より詳細に本について話:

The case against INFORMATION_SCHEMA views

あなたはこのためにsys.indexessys.index_columnsを使用します。たとえば、次のように

DECLARE @tablename NVARCHAR(512) = 'dbo.tbl_ClientDN'; 

SELECT 
    [Index] = i.name, 
    [Column] = c.Name, 
    [Type] = i.type_desc, 
    PK = i.is_primary_key, 
    [Unique] = i.is_unique, 
    [Unique Constraint] = i.is_unique_constraint, 
    [DESC] = ic.is_descending_key, 
    [INCLUDE] = ic.is_included_column, 
    [Filtered] = i.filter_definition -- only for SQL Server 2008+ 
FROM 
    sys.indexes AS i 
INNER JOIN 
    sys.index_columns AS ic 
    ON i.[object_id] = ic.[object_id] 
    AND i.index_id = ic.index_id 
INNER JOIN 
    sys.columns c 
    ON ic.column_id = c.column_id 
    AND ic.[object_id] = c.[object_id] 
WHERE 
    i.[object_id] = OBJECT_ID(@tablename) 
ORDER BY [Index], ic.index_column_id; 

あなたが一度にすべてのテーブルのためにこれをしたい場合は、簡単な変更:

SELECT 
    [Table] = QUOTENAME(OBJECT_SCHEMA_NAME(i.[object_id])) 
     + '.' + QUOTENAME(OBJECT_NAME(i.[object_id])), 
    [Index] = i.name, 
    [Column] = c.Name, 
    [Type] = i.type_desc, 
    PK = i.is_primary_key, 
    [Unique] = i.is_unique, 
    [Unique Constraint] = i.is_unique_constraint, 
    [DESC] = ic.is_descending_key, 
    [INCLUDE] = ic.is_included_column, 
    [Filtered] = i.filter_definition -- only for SQL Server 2008+ 
FROM 
    sys.indexes AS i 
INNER JOIN 
    sys.index_columns AS ic 
    ON i.[object_id] = ic.[object_id] 
    AND i.index_id = ic.index_id 
INNER JOIN 
    sys.columns c 
    ON ic.column_id = c.column_id 
    AND ic.[object_id] = c.[object_id] 
ORDER BY [Table], [Index], ic.index_column_id; 

は、あなたが使用しているSQL Serverのバージョンを指定するので、ここにいるしませんでしたsys.indexessys.index_columnsに関するトピックへのリンクのすべて:

sys.indexes

SQLのSe RVER 2005 http://technet.microsoft.com/en-us/library/ms173760%28SQL.90%29.aspx
SQL Server 2008のhttp://technet.microsoft.com/en-us/library/ms173760%28SQL.100%29.aspx
のSQL Server 2008 R2 http://technet.microsoft.com/en-us/library/ms173760%28SQL.105%29.aspx
SQL Server 2012のhttp://technet.microsoft.com/en-us/library/ms173760%28SQL.110%29.aspx

sys.index_columns

SQL Server 2005のhttp://technet.microsoft.com/en-us/library/ms175105%28SQL.90%29.aspx
SQL Server 2008のhttp://technet.microsoft.com/en-us/library/ms175105%28SQL.100%29.aspx
SQL Server 2008のR2 http://technet.microsoft.com/en-us/library/ms175105%28SQL.105%29.aspx
S QL Server 2012 http://technet.microsoft.com/en-us/library/ms175105%28SQL.110%29.aspx

Kimberley L. Trippさんのsp_helpindex2をご覧ください。一般的に


EDIT

私は、@ BrianWhiteさんのコメントに同意します。これに何か努力を費やしているのであれば、ホイールを再発明して自分で書き込もうとする代わりに、このためのツールを使用しているはずです。この1つのクエリのトラブルシューティングは、おそらくすでに時間の点で、優れたツールのコストを費やしています。この記事をお読みください:

http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/

+0

更新情報ありがとうございます。私はRedGateのような素晴らしいツールを使用したいと思いますが、残念ながら私たちは既存のモニタUI(Javaプロジェクト)を使用してそれを行う必要があります。ご返信いただきありがとうございます。 – sana

0

おそらく、あなたはsp_help

http://msdn.microsoft.com/en-us/library/ms187335.aspx

後単にあなたが望むことができるすべてのデータを与える必要があり

sp_help myTableName 

を入力しています。

+0

Well.thanks Mathew .yeah、私はすべての情報を得る)をsp_helpから削除することはできますが、実稼働サーバーの各テーブルについてUIがsp_helpを呼び出す場合は、パフォーマンスが向上しますか? – sana

+1

私はすべてのテーブルに対してループのsp_helpは残忍で、必要以上に多くの情報を得ると思います。私はまた、あなたがそれらの結果をどのように消費するのかも知らない。私はあなたの質問が尋ねるように指定されたテーブルの代わりにすべてのテーブルのインデックスデータを取得する単一のクエリを含めるように私の答えを更新しました。 –

関連する問題