Да, вы можете сделать это, изучив системные представления sys.indexes и sys.index_columns .
Например, если вы хотите узнать, есть ли индекс в столбце «StartDate» в таблице «Production.BillOfMaterials» в базе данных AdventureWorks,
, вы можете выполнить следующий запрос,
DECLARE @colName AS SYSNAME = 'StartDate'
DECLARE @tableName AS NVARCHAR(256) = 'Production.BillOfMaterials'
SELECT i.name AS index_name,
COL_NAME(ic.object_id, ic.column_id) AS column_name,
ic.index_column_id,
ic.key_ordinal,
ic.is_included_column
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
WHERE i.object_id = OBJECT_ID(@tableName)
AND COL_NAME(ic.object_id, ic.column_id) = @colName;
… и вы получите следующий результат
На основе вашего комментария я создал еще два примера
Первый - фильтрация по имени столбца
В приведенном ниже фрагменте есть ответ, почему вы не можете получить желаемый результат. Object_Id основан на схеме, поэтому передача только имени таблицы без схемы дает значение NULL.
В этом примере я фильтрую системные представления в базе данных AdvantureWorks2016 на основе столбца «StartDate»
DECLARE @colName AS SYSNAME = 'StartDate'
--DECLARE @tableName AS NVARCHAR(256) = 'Production.BillOfMaterials'
SELECT i.name [Index Name],
OBJECT_SCHEMA_NAME(ic.object_id) + '.' + OBJECT_NAME(ic.object_id) [Table Name],
COL_NAME(ic.object_id, ic.column_id) [Column Name],
ic.index_column_id,
ic.key_ordinal,
ic.is_included_column
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
WHERE COL_NAME(ic.object_id, ic.column_id) = @colName
ORDER BY [Table Name]
Результат показан на рисунке ниже.
Вторая фильтрация на основе списка таблиц
Если вы хотите уменьшить область действия таблиц. Допустим, вы знаете список таблиц, которые вы хотите изучить, вы можете использовать следующий фрагмент.
DECLARE @tables AS TABLE
(
TableName NVARCHAR(256)
)
INSERT INTO @tables
VALUES
('HumanResources.EmployeeDepartmentHistory'),
('Production.BillOfMaterials'),
('Production.ProductCostHistory'),
('Production.ProductListPriceHistory')
SELECT i.name [Index Name],
OBJECT_SCHEMA_NAME(ic.object_id) + '.' + OBJECT_NAME(ic.object_id) [Table Name],
COL_NAME(ic.object_id, ic.column_id) [Column Name],
ic.index_column_id,
ic.key_ordinal,
ic.is_included_column
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
WHERE EXISTS
(
SELECT * FROM @tables t WHERE t.TableName = OBJECT_SCHEMA_NAME(ic.object_id) + '.' + OBJECT_NAME(ic.object_id)
)
ORDER BY [Table Name]
И результат показан на рисунке ниже.