如何在sql server中动态声明PARTITION RANGE IN Partition函数

时间:2013-09-17 06:33:26

标签: sql sql-server partitioning

我想动态声明我的分区函数的范围。 我不想硬编码范围值,如下所示:

  

创建分区功能PartFun(smallint)左侧值(1,2,3,4,5)

问题是:我想在其上创建分区的列(IDMASTER表中的ID)是smallint数据类型。

Declare @IDS NVARCHAR(100)

SELECT @IDS = coalesce(@IDS + ', ', '') + CAST(a.ID AS VARCHAR) FROM 
             (SELECT DISTINCT TOP 100 ID from IDMASTER ORDER BY ID ) a
--PRINT @IDS --it prints 0,1,2,3,4 like that

CREATE PARTITION FUNCTION PartFun(smallint)
AS RANGE LEFT FOR VALUES (@IDS)

出现此错误:

  

“无法将在序号1中指定的范围值类型隐式转换为分区函数参数类型。”

任何解决方法的想法? 另外,人们大多使用硬编码值来划分分区吗?

3 个答案:

答案 0 :(得分:2)

可能无法准确解决您所寻找的问题。这是我面临的情景:

我们有一个DB,它在名为'PriceListDate'的列上有多个表分区,但奇怪的是,数据类型是Varchar(8)。我们正在重新设计应用程序和数据库,因此决定将数据类型更改为“日期”。以下是我们动态执行此操作的方法:

IF NOT EXISTS (SELECT NULL FROM sys.partition_functions WHERE name = N'PriceListDateFunction')
BEGIN;
    DECLARE @CreatePartitionFunctionScript NVARCHAR(MAX);

    SET @CreatePartitionFunctionScript =  'CREATE PARTITION FUNCTION [PriceListDateFunction] (Date) AS RANGE LEFT FOR VALUES (' +
                                            STUFF((SELECT ','+'N'+''''+CAST(prv.value as varchar(8))+'''' 
                                                        FROM sys.partition_range_values prv 
                                                        INNER JOIN sys.partition_functions pf 
                                                            ON pf.function_id = prv.function_id 
                                                        WHERE pf.name = 'PriceListFunction' 
                                                    FOR XML PATH(''), TYPE 
                                                    ).value('.', 'NVARCHAR(MAX)'),1,1,'') --Get list of existing partitons from existing partition function
                                                + ')';  
    --  Create Partition Function
    EXECUTE sp_executesql @CreatePartitionFunctionScript;
END;

希望这会给你一些想法。

拉​​吉

答案 1 :(得分:0)

谢谢,明白了。 这就是我解决它的方法:

DECLARE @sqlcmd nvarchar(400),@ids nvarchar(100);
SET @sqlcmd = N'CREATE PARTITION FUNCTION PartFun(smallint) AS RANGE LEFT FOR VALUES (' + @ids + N')' ;
--PRINT @sqlcmd
EXEC SP_EXECUTESQL @sqlcmd 

所以解决方案是:动态SQL并将所有内容都设为NVARCHAR!

答案 2 :(得分:0)

你能做的就是:

使用QuoteName(exp,'''')

创建值字符串(在本例中为ids)时,其余值保持不变。然后正常执行它并且效果很好。