0

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

创建分区函数 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 指定的范围值类型隐式转换为分区函数参数类型。”

任何解决方法的想法?另外,人们是否主要使用硬编码值作为分区范围?

4

3 回答 3

2

可能不是您正在寻找的确切解决方案。这是我面临的情况:

我们有一个数据库,它在名为“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;

希望这能给你一些想法。

拉吉

于 2013-09-17T06:41:49.673 回答
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!

于 2013-09-17T18:02:04.327 回答
0

那么你可以做的是:

使用 QuoteName(exp,'''')

在创建您的值字符串(在本例中为 id)时,其余部分保持不变。然后正常执行,效果很好。

于 2016-06-13T22:14:01.833 回答