web-dev-qa-db-ja.com

パーティション関数とパーティションスキーマの作成スクリプトを生成する方法

テーブル作成スクリプトを生成するスクリプトがあります。 この質問に対する私の回答で確認できます

ただし、ここで パーティション関数 および パーティションスキーム をスクリプト化する必要があります。

この質問について 、テーブルにパーティションを追加する方法とテーブルからパーティションを削除する方法の例が含まれている回答を参照してください。どの段階でもスクリプトを確認したいと思います。

私はこのリンクを見つけました: テーブルに適用されたパーティション関数テキストを見つける方法

パーティション関数とパーティションスキーマを作成するためのスクリプトを生成する方法

以下のようにcreate partition functionを生成するスクリプトを作成していましたが、wasという事実を乗り越えるのが難しいため、自分のPF_yearパーティション関数でのみ機能します- sys.partition_range_values には、値として sql_variant データ型があります。

ケースを使用すると、次のエラーが発生しました。

メッセージ206、レベル16、状態2、行35

オペランドタイプの干渉:intは日付と互換性がありません

それから彼の素晴らしい答え Dan Guzman が私たちに示した SQL_VARIANT_PROPERTY 私が知らなかったいくつかの素晴らしいことを今、私は新しいDBAであり、人です。

   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SELECT
    RADHE = 'CREATE PARTITION FUNCTION' + space(1) + quotename(spf.name) + 
'(' +  
    COALESCE(baset.name,'data type not found') +   ')' + CHAR(13) + 
    'AS RANGE ' + CASE WHEN CAST(spf.boundary_value_on_right AS int) = 1 
THEN 'RIGHT ' ELSE 'LEFT ' END  + CHAR(13) +
    'FOR VALUES (' +
    (SELECT STUFF(
    (SELECT
    [text()] = N',''' + CAST(
                      CASE st.system_type_id 
                       WHEN 40 THEN CONVERT (date, sprv.value,126) 
                       --WHEN 56 THEN CONVERT (int,  sprv.value)
                       --ELSE CONVERT (int,  sprv.value)
                      END 
                      AS NVARCHAR) + ''''
    FROM sys.partition_range_values sprv 
    WHERE sprv.function_id=spf.function_id
    order by sprv.boundary_id
     FOR XML PATH('') ), 1, 1,N'')+ N');')

    ,st.system_type_id
    ,spf.name AS [Name],
    spf.function_id AS [ID],
    CAST(spf.boundary_value_on_right AS int) AS [RangeType],
    spf.create_date AS [CreateDate],
    spf.fanout AS [NumberOfPartitions]
    FROM
    sys.partition_functions AS spf

    INNER JOIN sys.partition_parameters AS spp 
            ON spp.function_id=spf.function_id

    INNER JOIN sys.types AS st 
            ON st.system_type_id = st.user_type_id 
           and spp.system_type_id = st.system_type_id

    LEFT OUTER JOIN sys.types AS baset 
                  ON (     baset.user_type_id = spp.system_type_id 
                       and baset.user_type_id = baset.system_type_id) 

                  or (     (baset.system_type_id = spp.system_type_id) 
                       and (baset.user_type_id = spp.user_type_id) 
                       and (baset.is_user_defined = 0) 
                       and (baset.is_Assembly_type = 1))
    WHERE spf.name = 'PF_YEAR';
4

Terry Cの回答 に関するコメントから、パーティション関数とスキーマをスクリプト化するT-SQLソリューションを探していることがわかります。 (SSMS、Powershell、Visual Studioを介した)SMOまたはSSDTがDDLのスクリプト作成に適したツールであると思いますが、醜いT-SQLを使用して実現することもできます。以下は、この特定のタスクのサンプルスクリプトです。

SELECT
      N'CREATE PARTITION FUNCTION ' 
    + QUOTENAME(pf.name)
    + N'(' + t.name  + N')'
    + N' AS RANGE ' 
    + CASE WHEN pf.boundary_value_on_right = 1 THEN N'RIGHT' ELSE N'LEFT' END
    + ' FOR VALUES('
    +
    (SELECT
        STUFF((SELECT
            N','
            + CASE
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') IN(N'char', N'varchar') 
                    THEN QUOTENAME(CAST(r.value AS nvarchar(4000)), '''')
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') IN(N'nchar', N'nvarchar') 
                    THEN N'N' + QUOTENAME(CAST(r.value AS nvarchar(4000)), '''')
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'date' 
                    THEN QUOTENAME(FORMAT(CAST(r.value AS date), 'yyyy-MM-dd'),'''')
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'datetime' 
                    THEN QUOTENAME(FORMAT(CAST(r.value AS datetime), 'yyyy-MM-ddTHH:mm:ss'),'''')
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') IN(N'datetime', N'smalldatetime') 
                    THEN QUOTENAME(FORMAT(CAST(r.value AS datetime), 'yyyy-MM-ddTHH:mm:ss.fff'),'''')
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'datetime2' 
                    THEN QUOTENAME(FORMAT(CAST(r.value AS datetime2), 'yyyy-MM-ddTHH:mm:ss.fffffff'),'''')
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'datetimeoffset' 
                    THEN QUOTENAME(FORMAT(CAST(r.value AS datetimeoffset), 'yyyy-MM-dd HH:mm:ss.fffffff K'),'''')
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'time' 
                    THEN QUOTENAME(FORMAT(CAST(r.value AS time), 'hh\:mm\:ss\.fffffff'),'''') --'HH\:mm\:ss\.fffffff'
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'uniqueidentifier' 
                    THEN QUOTENAME(CAST(r.value AS nvarchar(4000)), '''')
                  WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') IN (N'binary', N'varbinary') 
                    THEN CONVERT(nvarchar(4000), r.value, 1)
                  ELSE CAST(r.value AS nvarchar(4000))
              END
    FROM sys.partition_range_values AS r
    WHERE pf.[function_id] = r.[function_id]
    FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)'),1,1,N'')
    )
    + N');'
FROM sys.partition_functions pf
JOIN sys.partition_parameters AS pp ON
    pp.function_id = pf.function_id
JOIN sys.types AS t ON
    t.system_type_id = pp.system_type_id
    AND t.user_type_id = pp.user_type_id
WHERE pf.name = N'PF_Year';

SELECT
      N'CREATE PARTITION SCHEME ' + QUOTENAME(ps.name)
    + N' AS PARTTITION ' + QUOTENAME(pf.name)
    + N' TO ('
    +
    (SELECT
        STUFF((SELECT
            N',' + QUOTENAME(fg.name)
    FROM sys.data_spaces ds
    JOIN sys.destination_data_spaces AS dds ON dds.partition_scheme_id = ps.data_space_id
    JOIN sys.filegroups AS fg ON fg.data_space_id = dds.data_space_id
    WHERE ps.data_space_id = ds.data_space_id
    ORDER BY dds.destination_id
    FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)'),1,1,N'')
    )
    + N');'
FROM sys.partition_schemes AS ps
JOIN sys.partition_functions AS pf ON pf.function_id = ps.function_id
WHERE ps.name = N'PSC_Year';
9
Dan Guzman

次の手順を試してください:

  1. SSMSの使用-スクリプトオプションを確認します。
    [ツール/オプション]メニューに移動します。 'SQL Server Object Explorer'/'Scripting'に移動し、 'Script Partition Schemes'がTrueに設定されていることを確認します。 (Falseがデフォルトのようです)また、「スクリプトファイルグループ」の設定を確認する価値があります。

  2. オブジェクトエクスプローラーで、データベース名を右クリックし、すべてのデータベースオブジェクトに対して[タスク]/[スクリプトの生成]を選択します。スクリプト化されたテキストの早い段階でパーティション構成が表示されるはずです。

6
Terry C