Как добавить раздел в существующую таблицу?

#sql-server #tsql #partition

#sql-server #tsql #раздел

Вопрос:

Учитывая функцию разделения ( MonthlyPartition(DateTime2) ), схему разделения ( Logs_PartitionScheme ), использующую эту функцию, и таблицу ( Logs ), для которой этот раздел должен применяться к ее [DateTime] полю; как мне добавить раздел в таблицу?

Я пробовал:

 ALTER TABLE dbo.Logs
ADD PARTITION Logs_PartitionScheme
 

но просто получите это, когда я его запущу:

Столбец, параметр или переменная # 40: не удается найти Logs_PartitionScheme типа данных.

Я думаю, что это просто попытка добавить столбец с именем «РАЗДЕЛ» Logs с типом Logs_PartitionScheme . Я также получаю то же самое, если заменяю Logs_PartitionScheme на MonthlyPartition .

Logs_PartitionScheme выглядит следующим образом:

 CREATE PARTITION SCHEME CatLogs_PartitionScheme
AS PARTITION MonthlyPartition
ALL TO ([Primary])
 

MonthlyPartition выглядит следующим образом:

 DECLARE @partitionsTable dbo.VarCharCollectionTableType --User-Defined Table Type to hold a collection of VarChars.

INSERT INTO @partitionsTable
SELECT DISTINCT CONCAT(FORMAT(RY, '0000'), FORMAT(RM, '00'), '01')
FROM dbo.Logs

DECLARE @partitionsString VARCHAR(MAX)

SELECT @partitionsString =
    CASE
        WHEN @partitionsString IS NULL
        THEN CONCAT('''', [Text], '''')
        ELSE CONCAT(@partitionsString, ', ''', [Text], '''')
    END
    FROM @partitionsTable
    ORDER BY [Text]

DECLARE @statement NVARCHAR(MAX) =
(
    SELECT CONCAT
    (
        N'CREATE PARTITION FUNCTION MonthlyPartition(DateTime2)
        AS RANGE RIGHT FOR VALUES
        (',
        @partitionsString,
        ')'
    )
)

EXECUTE SP_EXECUTESQL @statement
 

Комментарии:

1. ИЗМЕНИТЬ ФУНКЦИЮ РАЗДЕЛА

2. Вы должны удалить свой кластеризованный индекс и повторно добавить его с on partition Logs_PartitionScheme помощью предложения

3. Какой кластеризованный индекс? У меня есть один в поле Primary Key ( Id ) — этот?

4. Да … первичный ключ, вероятно, s / b кластеризован… и любые индексы, использующие первичный ключ или столбец раздела, также должны быть on partition... добавлены в индекс.

5. Извините, я все еще пытаюсь заставить это работать! Я не могу удалить и повторно добавить кластеризованный индекс, потому что он является частью первичного ключа. Я попытался повторно добавить первичный ключ как некластеризованный, а затем создать кластеризованный индекс таким образом CREATE CLUSTERED INDEX IX_Logs_ParentEntityId_DateTime ON dbo.Logs ( ParentEntityId, [DateTime] ) PARTITION Logs_PartitionScheme , но затем я просто получаю:> Неправильный синтаксис рядом с «РАЗДЕЛОМ».

Ответ №1:

Чтобы создать новый раздел, установите для схемы разделов next used filegroup желаемую и SPLIT функцию для создания новой границы раздела для данных в этой файловой группе. Например:

 ALTER PARTITION SCHEME Logs_PartitionScheme NEXT USED [PRIMARY];
ALTER PARTITION FUNCTION MonthlyPartition() SPLIT RANGE('2019-05-01T00:00:00.0000000');
 

Комментарии:

1. Я включу определения Logs_PartitionScheme и MonthlyPartition в вопрос. Я не думаю, что этот код делает то, что мне нужно (то есть добавляет схему или функцию в таблицу).