0

パーティション関数の範囲を動的に宣言したいと考えています。以下のように、範囲値をハードコーディングしたくありません。

CREATE PARTITION FUNCTION PartFun(smallint)AS RANGE LEFT FOR VALUES (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」という名前の列で分割された複数のテーブルを持つ DB がありますが、奇妙なことに、データ型は Varchar(8) です。アプリケーションとDBを再設計中なので、データ型を「Date」に変更することにしました。これを動的に行う方法は次のとおりです。

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 に答える