web-dev-qa-db-ja.com

実際の値のないSQLパーティション関数

会計年度ごとにカラムを分割したいと思います。コーディング値をハード化せずにパーティション関数を作成するにはどうすればよいですか?これは私が現在以下に持っているものです。

create table dbo.CustomerAccount
(
    CustomerAccountId bigint primary key identity(1,1),
    CustomerId int not null,
    FiscalYear int,
    AccountBalance numeric(15,2)
)

コーディング値をハード化せずにパーティション関数を作成するにはどうすればよいですか?

CREATE PARTITION FUNCTION DateRangePF (datetime)
AS RANGE RIGHT FOR VALUES ('2015', '2016','2017')
1
user129291

CREATE PARTITION FUNCTIONステートメントで動的VALUES句を作成することはできません。別の方法としては、ALTER PARTITION FUNCTIONステートメントを使用して、新しい範囲を関数に追加します。

必要なステートメントをストアドプロシージャにカプセル化しました。

IF OBJECT_ID(N'dbo.partition_function_add_date_range', N'P') IS NOT NULL
DROP PROCEDURE dbo.partition_function_add_date_range;
GO
CREATE PROCEDURE dbo.partition_function_add_date_range
(
      @function_name sysname
    , @range_date datetime
    , @scheme_name sysname
    , @next_filegroup sysname
)
AS
BEGIN
    SET NOCOUNT ON;
    IF NOT EXISTS (
        SELECT 1
        FROM sys.partition_functions pf
        INNER JOIN sys.partition_range_values prv ON pf.function_id = prv.function_id
        WHERE pf.name = @function_name
            AND prv.value = @range_date
        )
    BEGIN
        DECLARE @cmd nvarchar(max);
        SET @cmd = N'ALTER PARTITION SCHEME ' + QUOTENAME(@scheme_name) + N' NEXT USED ' + QUOTENAME(@next_filegroup) + N';';
        PRINT @cmd;
        EXEC sys.sp_executesql @cmd;
        SET @cmd = N'ALTER PARTITION FUNCTION ' + QUOTENAME(@function_name) + N'() SPLIT RANGE (''' + CONVERT(nvarchar(max), @range_date, 120) + N''');';
        PRINT @cmd;
        EXEC sys.sp_executesql @cmd;
    END
END
GO

このストアドプロシージャを呼び出す方法の例:

EXEC dbo.partition_function_add_date_range @function_name = N'DateRangePF '
    , @range_date = '2018-01-01 00:00:00'
    , @scheme_name = N'DateRangeSC'
    , @next_filegroup = N'PRIMARY';

これは、行が新しい会計年度に挿入される前に、年に1回実行するようにスケジュールされたSQL Serverエージェントジョブに追加できます。ジョブステップコマンドは次のようなものを実行します。これにより、来年がパーティション関数と関連するテーブルに自動的に追加されます。

DECLARE @daterange datetime;
SET @daterange = CONVERT(varchar(30), DATEPART(YEAR, GETDATE()) + 1) + '-01-01 00:00:00';
EXEC dbo.partition_function_add_date_range @function_name = N'DateRangePF'
    , @range_date = @daterange
    , @scheme_name = N'DateRangeSC'
    , @next_filegroup = N'PRIMARY';

パーティション関数の変更は、パーティション関数を使用するすべてのテーブルに影響することを理解することが重要です。

1
Max Vernon