会計年度ごとにカラムを分割したいと思います。コーディング値をハード化せずにパーティション関数を作成するにはどうすればよいですか?これは私が現在以下に持っているものです。
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')
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';
パーティション関数の変更は、パーティション関数を使用するすべてのテーブルに影響することを理解することが重要です。