Как динамически добавить файловую группу при создании индекса в SQL Server?

Мне нужно переместить некоторые таблицы из основной файловой группы в основную группу по умолчанию. У меня есть 3 разных среды, и в каждой среде имя файловой группы по умолчанию отличается. Таким образом, я могу получить имя группы файлов по умолчанию как:

select name from sys.filegroups where is_default=1;

Теперь, воссоздавая мои индексы, я хочу использовать вывод вышеуказанного запроса, чтобы указать группу файлов, в которой я хочу создать индекс (поскольку файловая группа по умолчанию имеет разные имена в разных средах, поэтому я хочу, чтобы продвигался только один запрос) . Я пробовал как:

CREATE UNIQUE CLUSTERED INDEX PK_INDEX
ON slam.MY_TABLE(COL_1)
WITH (DROP_EXISTING=ON) ON [select name from sys.filegroups where is_default=1];

Но я столкнулся с ошибкой ниже:

Сообщение 1921, уровень 16, состояние 1, строка 19 Недопустимая файловая группа «выберите имя из sys.filegroups, где is_default = 1».

Любая помощь будет высоко ценится.


person codeLover    schedule 29.11.2018    source источник
comment
По умолчанию любая созданная вами таблица или индекс будут храниться в файловой группе по умолчанию. Здесь ничего особенного делать не нужно — просто снимите часть FG.   -  person SMor    schedule 29.11.2018
comment
Проблема заключается в том, что была создана новая файловая группа, которая была отмечена как используемая по умолчанию. Таблицы и индексы были созданы до создания файловой группы. Я просто хочу переместить таблицы из группы файлов PRIMARY во вновь созданную группу файлов по умолчанию.   -  person codeLover    schedule 29.11.2018


Ответы (1)


Для этого вам нужно использовать динамический sql. Выберите имя вашей файловой группы по умолчанию, создайте свой запрос и выполните его следующим образом:

declare @fg_name nvarchar(250), @sql nvarchar(max);
select @fg_name = name from sys.filegroups where is_default=1;
set @sql = N'CREATE UNIQUE CLUSTERED INDEX PK_INDEX
    ON slam.MY_TABLE(COL_1)
    WITH (DROP_EXISTING=ON) ON [' + @fg_name + N'];';
exec sp_executesql @sql;
person Andrey Nikolov    schedule 29.11.2018
comment
Нет способа сделать это в одном запросе? - person codeLover; 29.11.2018
comment
Я так не думаю. Однако вы можете объединить построение запроса и выбор имени группы файлов в один запрос. Но почему вы хотите быть одним запросом? - person Andrey Nikolov; 29.11.2018
comment
Поскольку я не уверен, разрешен ли мне динамический sql qill или нет в соответствии с организационными стандартами - person codeLover; 29.11.2018
comment
Хорошо, тогда почему бы просто не опустить имя группы файлов. Он должен перейти к значению по умолчанию. - person Andrey Nikolov; 29.11.2018
comment
нет не идет - person codeLover; 29.11.2018
comment
Правильный. Если вы ничего не укажете, он попадет в ту же файловую группу, что и таблица. Вы должны указать default, например CREATE UNIQUE CLUSTERED INDEX PK_INDEX ON slam.MY_TABLE(COL_1) WITH (DROP_EXISTING=ON) ON [default];. - person Andrey Nikolov; 29.11.2018