【问题标题】:Equivalent query in sql server for INFORMATION_SCHEMAsql server 中对 INFORMATION_SCHEMA 的等效查询
【发布时间】:2012-04-30 15:28:05
【问题描述】:

我正在处理一个页面,我们需要直观地比较两个数据库中同一个表的架构——一个在 sql server 中,另一个在 mysql 中。我还必须包含索引。

现在 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'

所以我需要查询来组合 -

的结果
 sp_helpindex 'tbl_ClientDN'

如何获取在 mssql 查询中显示索引的 column_key。 有什么建议吗?

【问题讨论】:

标签: mysql sql sql-server database


【解决方案1】:

远离INFORMATION_SCHEMA.COLUMNS,尤其是对于索引,因为过滤索引和包含列等内容不属于定义的一部分。我在这里更详细地讨论这个:

您想为此使用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;

更多信息请参见主题sys.indexessys.index_columns

您可能还想看看 Kimberley L. Tripp 的 sp_helpindex2


编辑

总的来说,我同意@BrianWhite 的评论。如果您为此付出任何努力,则应该为此使用工具,而不是重新发明轮子并尝试自己编写。就时间而言,您可能已经花费了一个好工具的成本来对这个查询进行故障排除。请阅读这篇文章:

【讨论】:

  • 感谢 Aaron 的更新。我希望我可以使用像 RedGate 这样的好工具,但不幸的是我们需要使用我们现有的监视器 UI(java 项目)来完成它。非常感谢您的回复和建议。
【解决方案2】:

也许你在追sp_help

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

只需输入

sp_help myTableName

应该给你所有你想要的数据。

【讨论】:

  • well.thanks Mathew .yeah,我从 sp_help 获得了所有信息(比我需要的多得多),但是如果 UI 也为生产服务器上的每个表调用 sp_help,性能是否还可以?
  • 我认为 sp_help 在针对所有表的循环中是多余的,并且会为您提供比您需要的更多的信息。我也不知道您将如何使用这些结果。我更新了我的答案以包含一个查询,该查询获取所有表的索引数据,而不是您的问题要求的指定表。
猜你喜欢
  • 2014-05-30
  • 1970-01-01
  • 2018-04-05
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多