2012-04-30 42 views
6

我在一個頁面上工作,我們需要在兩個數據庫之間直觀地比較同一個表的模式 - 一個在sql server中,另一個在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服務器相同的查詢不返回indexes-

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

,所以我需要查詢到compbine的結果 -

sp_helpindex 'tbl_ClientDN' 

如何讓column_key顯示mssql查詢中的索引。 有什麼建議嗎?

+2

RedGate 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硒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


編輯

總的來說,我同意@ BrianWhite的評論。如果你在這方面付出了一切努力,那麼你應該使用一個工具來代替重新發明輪子並嘗試自己寫。從時間和成本上來看,您可能已經花費了一次這樣的查詢。請閱讀這篇文章:

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

+0

感謝您的更新Aaron.I希望我可以使用像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,但是如果用戶界面在生產服務器上爲每個表調用sp_help,性能是否合適呢? – sana

+1

我認爲sp_help在所有表的循環中都是矯枉過正的,並且會爲您提供比您需要的更多的信息。我也不知道你將如何消費這些結果。我更新了我的答案,包括一個單一的查詢,獲取所有表的索引數據,而不是您的問題所要求的指定表。 –