Как добавить границу раздела, только если она не существует в хранилище данных SQL?

Я использую хранилище данных SQL Azure Gen 1 и создаю таблицу разделов, подобную этой

CREATE TABLE [dbo].[StatsPerBin1](
[Bin1] [varchar](100) NOT NULL,
[TimeWindow] [datetime] NOT NULL,
[Count] [int] NOT NULL,
[Timestamp] [datetime] NOT NULL)
WITH
(
    DISTRIBUTION = HASH ( [Bin1] ),
    CLUSTERED INDEX([Bin1]),
    PARTITION
    (
        [TimeWindow] RANGE RIGHT FOR VALUES ()
     )
)

Как разделить раздел только тогда, когда такой границы нет?

Сначала я думаю, что если я могу получить границы разделов по имени таблицы, то я могу написать оператор if, чтобы определить, добавлять границы раздела или нет.

Но я не могу найти способ связать таблицу с соответствующими значениями разделов, значения разделов всех разделов могут быть получены с помощью

SELECT * FROM sys.partition_range_values

Но он содержит только идентификатор_функции как идентификатор, который я не знаю, как объединить другие таблицы, чтобы я мог получить границы разделов по имени таблицы.

1 ответ

Я знаю, что это устаревший вопрос, но у меня была такая же проблема. Вот запрос, который я закончил, который может помочь вам начать. Это немного изменено из запроса документации SQL Server:

SELECT      s.[name]                        AS      [schema_name]
,           t.[name]                        AS      [table_name]
,           p.[partition_number]            AS      [partition_number]
,           rv.[value]                      AS      [partition_boundary_value]
,           p.[data_compression_desc]       AS      [partition_compression_desc]
FROM        sys.schemas s
JOIN        sys.tables t                    ON      t.[schema_id]         = s.[schema_id]
JOIN        sys.partitions p                ON      p.[object_id]         = t.[object_id]
JOIN        sys.indexes i                   ON      i.[object_id]         = p.[object_id]
                                            AND     i.[index_id]          = p.[index_id]
JOIN        sys.data_spaces ds              ON      ds.[data_space_id]    = i.[data_space_id]
LEFT JOIN   sys.partition_schemes ps        ON      ps.[data_space_id]    = ds.[data_space_id]
LEFT JOIN   sys.partition_functions pf      ON      pf.[function_id]      = ps.[function_id]
LEFT JOIN   sys.partition_range_values rv   ON      rv.[function_id]      = pf.[function_id]
                                            AND     rv.[boundary_id]      = p.[partition_number]

Вы пытались присоединиться sys.partition_range_values с sys.partition_functions Посмотреть?

Конечно, мы не можем создавать функции секционирования в SQL DW, но представление, похоже, все еще поддерживается.

Другие вопросы по тегам