Sql-Server

沒有實際值的 SQL 分區函式

  • March 8, 2018

我想按會計年度對列進行分區。如何在不硬編碼值的情況下創建分區函式?這是我目前在下面。

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')

您不能VALUES在語句中創建動態子句CREATE PARTITION FUNCTION。另一種方法是使用該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';

這可以添加到 SQL Server 代理作業中,該作業計劃每年執行一次,然後將行插入新的會計年度。job step 命令將執行類似這樣的命令,它將自動將下一年添加到分區函式以及任何關聯的表中。

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';

重要的是要意識到分區函式的修改會影響所有使用分區函式的表。

引用自:https://dba.stackexchange.com/questions/199662