【问题标题】:How to find which indexes and constraints contain a specific column?如何查找哪些索引和约束包含特定列?
【发布时间】:2013-10-04 08:16:15
【问题描述】:

我正在计划更改数据库,并且我有一个包含在进程中的列列表。我可以列出包含特定列的所有索引吗?

编辑

到目前为止我有(结合答案):

declare @TableName nvarchar(128), @FieldName nvarchar(128)
select  @TableName= N'<<Table Name>>', @FieldName =N'<<Field Name>>'
(SELECT distinct systab.name AS TABLE_NAME,sysind.name AS INDEX_NAME, 'index' 
FROM sys.indexes sysind 
INNER JOIN sys.index_columns sysind_col 
    ON  sysind.object_id = sysind_col.object_id and sysind.index_id = sysind_col.index_id 
INNER JOIN sys.columns sys_col 
    ON sysind_col.object_id = sys_col.object_id and sysind_col.column_id = sys_col.column_id 
INNER JOIN sys.tables systab
    ON sysind.object_id = systab.object_id

WHERE systab.is_ms_shipped = 0 and sysind.is_primary_key=0 and sys_col.name  =@FieldName and systab.name=@TableName

union
select t.name TABLE_NAME,o.name, 'Default' OBJ_TYPE
 from sys.objects o 
inner join sys.columns c on o.object_id  = c.default_object_id
inner join sys.objects t on c.object_id  = t.object_id 
where o.type  in ('D') and c.name  =@FieldName and t.name=@TableName
union

SELECT u.TABLE_NAME,u.CONSTRAINT_NAME,  'Constraint' OBJ_TYPE  
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE u 

where u.COLUMN_NAME  = @FieldName and u.TABLE_NAME = @TableName
) order by 1

但我对 sys. 和“INFORMATION_SCHEMA”的组合不太满意。 可以避免吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql


    【解决方案1】:
    ---Using sp_helpindex and your TableName
    exec sp_helpindex YourTableName
    
    ---Using sys.tables with your TableName and ColumnName
    select distinct c.name, i.name, i.type_desc,...
    from sys.indexes i
            join sys.index_columns ic on i.index_id = ic.index_id 
            join sys.columns c on ic.column_id = c.column_id
    where i.object_id = OBJECT_ID(N'YourTableName') and c.name = 'YourColumnName'
    

    编辑:根据评论,您也可以加入 object_Ids 而不使用distinct

    select c.name, i.name, i.type_desc
    from sys.indexes i
            join sys.index_columns ic on i.index_id = ic.index_id and i.object_id = ic.object_id
            join sys.columns c on ic.column_id = c.column_id and ic.object_id = c.object_id
    where i.object_id = OBJECT_ID(N'YourTableName') and c.name = 'YourColumnName'
    

    【讨论】:

    • 不应该在连接中也包含 object_id 吗?它似乎返回了太多行。
    • 我已经更新了object_id join,这显然比使用Distinct更好。
    【解决方案2】:

    从 INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 中选择 *

    如果您知道表的约束条件,请在 WHERE 中使用 TABLE_NAME。

    如果您知道列名,请使用 column_name。

    【讨论】:

    • 如果您在数据库外使用,也使用数据库名称,如果像 .information_schema.CONSTRAINT_COLUMN_USAGE 一样
    • 感谢约束,但我也需要索引。
    【解决方案3】:

    要获取有关包含特定列的所有索引的信息,可以使用以下两个目录视图:

    sys.indexes , sys.index_columns
    

    查询:

    SELECT 
         sysind.name AS INDEX_NAME
        ,sysind.index_id AS  INDEX_ID
        ,sys_col.name AS COLUMN_NAME
        ,systab.name AS TABLE_NAME
    FROM sys.indexes sysind 
    INNER JOIN sys.index_columns sysind_col 
        ON  sysind.object_id = sysind_col.object_id and sysind.index_id = sysind_col.index_id 
    INNER JOIN sys.columns sys_col 
        ON sysind_col.object_id = sys_col.object_id and sysind_col.column_id = sys_col.column_id 
    INNER JOIN sys.tables systab
        ON sysind.object_id = systab.object_id 
    WHERE (1=1) 
          AND systab.is_ms_shipped = 0 
          AND sys_col.name  IN(specific column list for which indexes are to be queried)
    ORDER BY 
        systab.name,sys_col.name, sysind.name,sysind.index_id
    

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      如果您有权访问数据库上的 sys 架构,则可以查询 sys.indexes 以获取索引 ID,并将其与函数 index_col 一起使用以获取列。 index_col 的最后一个参数是索引中列的索引(即,如果索引中有 3 列,则必须调用 index_col 3 次,最后一个参数为 1、2、3)

      select index_id from sys.indexes
       where object_id = object_id(@objectname)
      
      select index_col(@objectname, @indexid, 1)
      

      这应该给你约束,因为它们只是特殊的索引。

      【讨论】:

      • 我知道列名和表名,我正在寻找索引。
      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      相关资源
      最近更新 更多