Сценарий, приведенный ниже, должен помочь:
declare @schemaName varchar(128)
declare @tableName varchar(128)
declare @columnName varchar(128)
declare @refSchemaName varchar(128)
declare @refTableName varchar(128)
declare @refColumnName varchar(128)
declare @sql nvarchar(max)
set @sql = ''
declare cur cursor for
select sch.name as SchemaName, tab.name as TableName, col.name as ColumnName, ref_sch.name as RefSchemaName, ref_tab.name as RefTableName, ref_col.name as RefColumnName
from sys.foreign_keys fk
join sys.foreign_key_columns fkc on fkc.constraint_object_id = fk.object_id
join sys.tables tab on tab.object_id = fkc.parent_object_id
join sys.schemas sch on sch.schema_id = tab.schema_id
join sys.columns col on fkc.parent_column_id = col.column_id and fkc.parent_object_id = col.object_id
join sys.tables ref_tab on ref_tab.object_id = fkc.referenced_object_id
join sys.schemas ref_sch on ref_sch.schema_id = ref_tab.schema_id
join sys.columns ref_col on fkc.referenced_column_id = ref_col.column_id and fkc.referenced_object_id = ref_col.object_id
open cur
fetch next from cur into @schemaName, @tableName, @columnName, @refSchemaName, @refTableName, @refColumnName
while @@FETCH_STATUS = 0
begin
set @sql = '
if not exists (SELECT * FROM sys.indexes
WHERE name=''IX_' + @schemaName + @tableName + '_' + @columnName + ''' AND object_id = OBJECT_ID(''' + @schemaName + '.' + @tableName + '''))
begin
CREATE INDEX IX_' + @schemaName + @tableName + '_' + @columnName + ' ON [' + @schemaName + '].[' + @tableName + ']
([' + @columnName + ']) WITH (FILLFACTOR = 80)
end'
--print @sql
exec sp_executesql @sql
fetch next from cur into @schemaName, @tableName, @columnName, @refSchemaName, @refTableName, @refColumnName
end
close cur
deallocate cur
После выбора всех внешних ключей он создает индексы с именами, такими как 'IX_ "schemaName" "tableName" _ "columnName"' и fillfactor = 80.