我想动态声明我的分区函数的范围。 我不想硬编码范围值,如下所示:
创建分区功能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中指定的范围值类型隐式转换为分区函数参数类型。”
任何解决方法的想法? 另外,人们大多使用硬编码值来划分分区吗?
答案 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)时,其余值保持不变。然后正常执行它并且效果很好。