Sql-Server
沒有實際值的 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')
您不能
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';
重要的是要意識到分區函式的修改會影響所有使用分區函式的表。