Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Получение списка индексов  [new]
BorisValkovich
Member

Откуда:
Сообщений: 16
Добрый день.
Подскажите, как можно получить список всех индексов из бд, и если они неправильно названы, вывести в другую колонку предполагаемое название?
10 авг 14, 20:39    [16423406]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
BorisValkovich
Добрый день.
Подскажите, как можно получить список всех индексов из бд, и если они неправильно названы, вывести в другую колонку предполагаемое название?
sys.indexes
10 авг 14, 20:43    [16423416]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
BorisValkovich
Member

Откуда:
Сообщений: 16
А как вывести в другую колонку, предполагаемое правильное название?
10 авг 14, 20:49    [16423426]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
BorisValkovich
А как вывести в другую колонку, предполагаемое правильное название?
Ээээ, не понял вопрос. Просто взять и вывести, как выводят все колонки.

Приведите пример запроса, как вы пытались сделать, и что нужно получить.
10 авг 14, 21:33    [16423510]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
NickAlex66
Member

Откуда:
Сообщений: 319
BorisValkovich,

Что значит "неправильно названы"? Гипотетические индексы?
10 авг 14, 23:46    [16423913]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
letefon
Member

Откуда:
Сообщений: 133
select top 1000
	sch.name as [schema_name], tbl.name as [table_name], clm_list.columns_list,
	idx.name as [index_name],
	case
		when idx.is_unique_constraint = 1 then 'UQ'
		when idx.is_primary_key = 1 then 'PK'
		else 'IX'
	end
	+ '__' + tbl.name + '_' + replace(clm_list.columns_list, ',', '_') as [index_NEW_name],
	N'exec sp_rename @objname = ''' + idx.name + ''''
	+ ', @newname = '''
	+  case
			when idx.is_unique_constraint = 1 then 'UQ'
			when idx.is_primary_key = 1 then 'PK'
			else 'IX'
	end
	+ '__' + tbl.name + '_' + replace(clm_list.columns_list, ',', '_')
	+  '''' as [script_to_rename]
FROM [sys].[indexes]  idx
inner join [sys].[objects] tbl on tbl.object_id = idx.object_id
inner join [sys].[schemas] sch on sch.schema_id = tbl.schema_id 
outer apply (
	select substring(
				replace((select 
					',' + clm2.name
					as 'data()'
					from [sys].[columns] clm2
					inner join [sys].[index_columns] ic2 on ic2.column_id = clm2.column_id and ic2.object_id = clm2.object_id
					where clm2.object_id = idx.object_id
						and ic2.index_id = idx.index_id
					order by ic2.key_ordinal asc
					for xml path('')
				), ' ,', ','), 
		2, 1024000) as columns_list
) clm_list
where	
	0 < idx.type
	and idx.name <>
		case
			when idx.is_unique_constraint = 1 then 'UQ'
			when idx.is_primary_key = 1 then 'PK'
			else 'IX'
		end
		+ '__' + tbl.name + '_' + replace(clm_list.columns_list, ',', '_')
order by sch.name, tbl.name, idx.name
11 авг 14, 11:09    [16424892]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
letefon
Member

Откуда:
Сообщений: 133
исправленный вариант (колонка script_to_rename):
select top 1000
	sch.name as [schema_name], tbl.name as [table_name], clm_list.columns_list,
	idx.name as [index_name],
	case
		when idx.is_unique_constraint = 1 then 'UQ'
		when idx.is_primary_key = 1 then 'PK'
		else 'IX'
	end
	+ '__' + tbl.name + '_' + replace(clm_list.columns_list, ',', '_') as [index_NEW_name],
	N'exec sp_rename @objname = ''' + quotename(sch.name, '[]') + '.' + quotename(tbl.name, '[]') + '.' + quotename(idx.name, '[]') + ''''
		+ ', @newname = '''
		+  case
				when idx.is_unique_constraint = 1 then 'UQ'
				when idx.is_primary_key = 1 then 'PK'
				else 'IX'
			end
			+ '__' + tbl.name + '_' + replace(clm_list.columns_list, ',', '_')
	+  ''''  as [script_to_rename]
FROM [sys].[indexes]  idx
inner join [sys].[objects] tbl on tbl.object_id = idx.object_id
inner join [sys].[schemas] sch on sch.schema_id = tbl.schema_id 
outer apply (
	select substring(
				replace((select 
					',' + clm2.name
					as 'data()'
					from [sys].[columns] clm2
					inner join [sys].[index_columns] ic2 on ic2.column_id = clm2.column_id and ic2.object_id = clm2.object_id
					where clm2.object_id = idx.object_id
						and ic2.index_id = idx.index_id
					order by ic2.key_ordinal asc
					for xml path('')
				), ' ,', ','), 
		2, 1024000) as columns_list
) clm_list
where	
	0 < idx.type
	and idx.name <>
		case
			when idx.is_unique_constraint = 1 then 'UQ'
			when idx.is_primary_key = 1 then 'PK'
			else 'IX'
		end
		+ '__' + tbl.name + '_' + replace(clm_list.columns_list, ',', '_')
order by sch.name, tbl.name, idx.name
11 авг 14, 11:19    [16424938]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
o-o
Guest
забавно.
мне этот скрипт предложил переправить названия некоторых уникальных индексов с UQ на IX.
потому что они не были объявлены констрэйнтами, а просто тупо созданы уникальными индексами.
11 авг 14, 13:55    [16426022]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Баловство по-моему. Типа расстановки книг на полке по размеру и цвету корешка.
11 авг 14, 14:34    [16426255]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
letefon
Member

Откуда:
Сообщений: 133
o-o,
это набросок-идея, можно проверять поле idx.is_unique и для него еще какой-то префикс придумать.

Владислав Колосов
Баловство по-моему. Типа расстановки книг на полке по размеру и цвету корешка.

Иногда это удобно для сравнения структур одинаковых БД.
И больше походит на расстановку книг на полке по автору или тематике.
11 авг 14, 15:42    [16426595]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка индексов  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Владислав Колосов
Баловство по-моему. Типа расстановки книг на полке по размеру и цвету корешка.
А если еще и индекс хинты где-то есть, то вообще вреда будет больше чем пользы.
11 авг 14, 20:29    [16427934]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить