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

Откуда:
Сообщений: 3
Здравствуйте. Подскажите, как можно создать индексы сразу для большого количества таблиц?
Во всех таблицах есть столбец с одинаковым названием, по которому и будет создаваться индекс, название индекса так же одинаковое.
Командой Select получаю список таблиц
select table_name 
from INFORMATION_SCHEMA.TABLES
where table_name like '%Суточная%'


На примере одной таблицы создал индексы
CREATE CLUSTERED INDEX ДатаВремя_кл   
    ON 'Суточная_1203303' (ДатаВремя)


Можно ли это как-то объединить в один запрос?
11 май 17, 15:03    [20472903]     Ответить | Цитировать Сообщить модератору
 Re: создать индекс для нескольких таблиц  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3436
Динамический запрос перебором тех самых таблиц.
Можно в процедуре.
Можно сгенерировать скрипт и затем выполнить.
11 май 17, 15:06    [20472915]     Ответить | Цитировать Сообщить модератору
 Re: создать индекс для нескольких таблиц  [new]
aleks2
Guest
Внезапно! Можно.

select 'CREATE CLUSTERED INDEX ДатаВремя_кл  ON ' + table_name + ' (ДатаВремя)'
  from INFORMATION_SCHEMA.TABLES
  where table_name like '%Суточная%'


1. Выполни.
2. Результат выполнения скопируй в окно SSMS.
3. Выполни.
11 май 17, 15:07    [20472920]     Ответить | Цитировать Сообщить модератору
 Re: создать индекс для нескольких таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
declare @s varchar(max);

select @s = (
 select 'create clustered index ДатаВремя_кл on ' + quotename(table_name) + ' (ДатаВремя);'
   from INFORMATION_SCHEMA.TABLES
   where table_name like '%Суточная%'
 for xml path(''), type).value('.', 'varchar(max)');

exec(@s);
11 май 17, 15:34    [20473078]     Ответить | Цитировать Сообщить модератору
 Re: создать индекс для нескольких таблиц  [new]
mmss
Member

Откуда:
Сообщений: 3
invm
declare @s varchar(max);

select @s = (
 select 'create clustered index ДатаВремя_кл on ' + quotename(table_name) + ' (ДатаВремя);'
   from INFORMATION_SCHEMA.TABLES
   where table_name like '%Суточная%'
 for xml path(''), type).value('.', 'varchar(max)');

exec(@s);


Отлично, спасибо, работает. Но не могли бы Вы чуть пояснить запись?
11 май 17, 16:45    [20473295]     Ответить | Цитировать Сообщить модератору
 Re: создать индекс для нескольких таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
mmss
Но не могли бы Вы чуть пояснить запись?
Что именно?
11 май 17, 17:29    [20473431]     Ответить | Цитировать Сообщить модератору
 Re: создать индекс для нескольких таблиц  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 774
invm
mmss
Но не могли бы Вы чуть пояснить запись?
Что именно?

Похоже, не все буквы знакомы...

2 ТС
select 'create clustered index ДатаВремя_кл on ' + quotename(table_name) + ' (ДатаВремя);'
   from INFORMATION_SCHEMA.TABLES
   where table_name like '%Суточная%'

Это практически то, что ты нам писал в первом посте - выборка нужных таблиц и создание для каждой из них команды создания индекса. В конце первой строки можно заметить важную ; которая разделяет команды для отдельных таблиц

 for xml path(''), type).value('.', 'varchar(max)');

Танцы с бубном ХМЛ, чтобы всё записало в одну строку, а потом преобразовало в тип varchar(max)

 exec(@s);

Запуск неглядя того, что насобирали.
11 май 17, 17:57    [20473485]     Ответить | Цитировать Сообщить модератору
 Re: создать индекс для нескольких таблиц  [new]
mmss
Member

Откуда:
Сообщений: 3
Шыфл

2 ТС
select 'create clustered index ДатаВремя_кл on ' + quotename(table_name) + ' (ДатаВремя);'
   from INFORMATION_SCHEMA.TABLES
   where table_name like '%Суточная%'

Это практически то, что ты нам писал в первом посте - выборка нужных таблиц и создание для каждой из них команды создания индекса. В конце первой строки можно заметить важную ; которая разделяет команды для отдельных таблиц

Мне казалось что запрос на вывод списка таблиц должен быть вложен в запрос на создание индекса, а получается наоборот. Вот это мне не очень понятно.
По строке с xml понял, спасибо
12 май 17, 09:10    [20474571]     Ответить | Цитировать Сообщить модератору
 Re: создать индекс для нескольких таблиц  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
mmss, если запрос по таблицам будет вложен в запрос на создание индекса, тогда и индекс у вас получится один. А вам нужно сделать столько индексов, сколько у вас таблиц, поэтому и текстовая строка создания повторяется для каждой записи в INFORMATION_SCHEMA.TABLES.
12 май 17, 10:17    [20474912]     Ответить | Цитировать Сообщить модератору
 Re: создать индекс для нескольких таблиц  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2159
mmss
Мне казалось что запрос на вывод списка таблиц должен быть вложен в запрос на создание индекса, а получается наоборот. Вот это мне не очень понятно.

Создается МНОГО запросов на создание индексов - для каждого индекса отдельный. Но все эти запросы записываются в одну большую строку.
А SQL Server разбирает эту большую строку (ориентируясь на ";") и выполняет много запросов на создание индексов.
12 май 17, 11:20    [20475346]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить