alexbraun
@alexbraun
Full Stack

Избавляюсь от секционирования в таблице, как сделать слияние партиций в цикле?

Использую 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;

Возможно ли объединение сделать в цикле?
  • Вопрос задан
  • 2626 просмотров
Пригласить эксперта
Ответы на вопрос 1
minamoto
@minamoto
Я не понял, зачем. Чтобы избавиться от секционирования, достаточно пересоздать PRIMARY KEY на основной раздел (не схему партиционирования). Зачем объединять значения то?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы