Na co dzień pracując z tabelami i indeksami partycjonującymi stworzyłem procedurę, która na podstawie parametrów wejściowych zwraca nazwę grupy plików, na której założona jest wybrana partycja.
Parametry wejściowe procedury to:
- @PartitionFunction – nazwa funkcji partycjonującej
- @PartitionSchema – nazwa schemy partycjonującej
- @RangeValue – wartość kolumny partycjonującej. Uwaga, obsługiwany jest typ INT . Dla innych typów kolumn partycjonujących należy zmodyfikować kod.
SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON GO IF OBJECT_ID(N'Tools.spGetFGfromPartitionScheme', 'P') IS NULL EXEC('CREATE PROCEDURE spGetFGfromPartitionScheme AS SELECT 1') GO ALTER PROCEDURE [spGetFGfromPartitionScheme] @DBName SYSNAME = 'FooBase' ,@PartitionFunction SYSNAME ,@PartitionSchema SYSNAME ,@RangeValue INT ,@FGPartitionName SYSNAME OUTPUT AS BEGIN SET NOCOUNT ON DECLARE @PartitionNumber int DECLARE @sql nvarchar(max) SET @sql = N'USE ['+@DBName+'] SELECT @PartNumber = $PARTITION.'+@PartitionFunction+'(@RangeVal)' EXEC SP_EXECUTESQL @sql,N'@RangeVal int, @PartNumber INT OUTPUT', @RangeVal = @RangeValue, @PartNumber = @PartitionNumber OUTPUT SET @sql= N' USE ['+ @DBName+'] SELECT @PartName = sf.name FROM sys.partition_schemes AS sps INNER JOIN sys.partition_functions AS spf ON sps.function_id = spf.function_id INNER JOIN sys.destination_data_spaces AS sdd ON sdd.partition_scheme_id = sps.data_space_id and sdd.destination_id <= spf.fanout INNER JOIN sys.filegroups AS sf ON sf.data_space_id = sdd.data_space_id WHERE (sps.name=@PartSchema) AND sdd.destination_id=@PartNumber ORDER BY sdd.destination_id ASC' EXEC SP_EXECUTESQL @sql,N'@PartSchema nvarchar(4000), @PartNumber int, @PartName SYSNAME OUTPUT', @PartSchema = @PartitionSchema, @PartNumber = @PartitionNumber, @PartName= @FGPartitionName OUTPUT END
Poniżej przedstawiony jest sposób wywołania procedury.
DECLARE @DBName SYSNAME = 'FooBase' ,@PartitionFunction SYSNAME = 'pfFooFunction' ,@PartitionSchema SYSNAME = 'psFooScheme' ,@RangeValue INT = 20170101 ,@PartitionSchemaName SYSNAME EXEC spGetFGfromPartitionScheme @DBName= @DBName ,@PartitionFunction = @PartitionFunction ,@PartitionSchema = @PartitionSchema ,@RangeValue = @RangeValue ,@FGPartitionName = @PartitionSchemaName OUTPUT SELECT @PartitionSchemaName