Использую MS SQL Server 2012.
1. сделал файловые группы
2. сделал файлы
3. создал функцию и схему секционирования
Я сделал 4 граничных значения, избавится от которых можно вызвав:
MERGE RANGE ()
делать этот вызов можно столько раз, столько партиций имеется. Что если партиций будет много? Хотел это сделать в цикле, но при выполнение запроса объединяются только 1 или 2 секции и никаких ошибок, для объединения оставшихся необходимо снова запускать скрипт:
-- Объединяем секции
BEGIN TRY
-- открываем тразакцию
BEGIN TRAN
-- Для перебора граничных значений используем курсор
DECLARE boundaryCursor cursor
FOR
--получаем граничные значения
SELECT r.value FROM sys.tables AS t
JOIN sys.indexes AS i
ON t.object_id = i.object_id
JOIN sys.partitions AS p
ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN sys.partition_schemes AS s
ON i.data_space_id = s.data_space_id
JOIN sys.partition_functions AS f
ON s.function_id = f.function_id
LEFT JOIN sys.partition_range_values AS r
ON f.function_id = r.function_id and r.boundary_id = p.partition_number
WHERE t.name = 'syn_PrimaryDocuments' AND i.type <= 1
OPEN boundaryCursor
DECLARE @counter int
DECLARE @boundary sql_variant
SET @counter = 0
fetch next from boundaryCursor INTO @boundary
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @boundary
IF @boundary IS NOT NULL
BEGIN
--Начало объединения по границе @boundary
IF EXISTS (SELECT * FROM sys.partition_functions WHERE name = 'stateFunction')
BEGIN
ALTER PARTITION FUNCTION stateFunction ()
MERGE RANGE (CAST(@boundary as int))
END
END
-- Конец объединения по границе @boundary
SET @counter = @counter + 1
fetch next from boundaryCursor INTO @boundary
END
CLOSE boundaryCursor
DEALLOCATE boundaryCursor
--Завершаем тразакцию в случае успеха
COMMIT TRAN
END TRY
BEGIN CATCH
--Откатываем
ROLLBACK TRAN
CLOSE boundaryCursor
DEALLOCATE boundaryCursor
--Получаем описание ошибок
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
Возможно ли объединение сделать в цикле?