首页 > 解决方案 > 从创建特定索引的表中获取列名

问题描述

SELECT name 
  FROM sys.COLUMNS 
 WHERE object_id = (
                    SELECT object_id 
                      FROM sys.objects 
                     WHERE name = 'Table_name'
                    ) 
   AND column_id = (
                    SELECT COLUMN_ID 
                      FROM sys.index_columns 
                     WHERE object_id = (
                                        SELECT object_id 
                                          FROM sys.objects 
                                         WHERE name = 'Table_name'
                                        )
                    )

我已经编写了这个提供正确结果的查询,但我认为它可以以更准确的方式编写。

有人可以帮助我以更紧凑的方式编写此查询吗?

标签: sql-server

解决方案


“更好”的方法是使用JOIN而不是相关的子查询(在我的情况下不起作用并抛出错误:“子查询返回多于一行”):

DECLARE @tableName SYSNAME = N'-your-table-name-here-';

SELECT 
    TableName = t.Name,
    IndexName = ix.Name,
    ColumnName = c.name 
FROM 
    sys.indexes ix
INNER JOIN 
    sys.tables t ON t.object_id = ix.object_id
INNER JOIN 
    sys.index_columns ic ON ic.object_id = t.object_id AND ic.index_id = ix.index_id
INNER JOIN 
    sys.columns c ON c.object_id = t.object_id AND c.column_id = ic.column_id
WHERE 
    t.Name = @tableName

我也倾向于尝试使用更集中的目录视图,sys.tables而不是依赖“包罗万象”的sys.objects视图


推荐阅读