sql >> データベース >  >> RDS >> Sqlserver

インデックスのリストの CREATE スクリプトを生成する

    あなたはかなり近いと思います-私はこれを試しました.これがあなたのために働くかどうかを確認して、再作成されると予想される122のインデックスを示してもらえますか??

    更新 :CLUSTERED と NONCLUSTERED のインデックス タイプを判別し、INCLUDE 列をインデックス定義に追加する機能が追加されました。

    WITH indexCTE AS
    (
        SELECT DISTINCT 
            i.index_id, i.name, i.object_id
        FROM 
            sys.indexes i 
        INNER JOIN
            sys.index_columns ic 
               ON i.index_id = ic.index_id AND i.object_id = ic.object_id
        WHERE 
            EXISTS (SELECT * FROM sys.columns c 
                     WHERE c.collation_name = 'Modern_Spanish_CI_AS' 
                     AND c.column_id = ic.column_id AND c.object_id = ic.object_id)
    ), 
    indexCTE2 AS
    (
        SELECT 
            indexCTE.name 'IndexName', 
            OBJECT_NAME(indexCTE.object_ID) 'TableName',
            CASE indexCTE.index_id 
              WHEN 1 THEN 'CLUSTERED'
              ELSE 'NONCLUSTERED'
            END AS 'IndexType', 
            (SELECT DISTINCT c.name + ','
             FROM 
                sys.columns c 
             INNER JOIN
                sys.index_columns ic 
                   ON c.object_id = ic.object_id AND ic.column_id = c.column_id AND ic.Is_Included_Column = 0
             WHERE
                indexCTE.OBJECT_ID = ic.object_id 
                AND indexCTE.index_id = ic.index_id 
             FOR XML PATH('')
            ) ixcols,
            ISNULL(
            (SELECT DISTINCT c.name + ','
             FROM 
                sys.columns c 
             INNER JOIN
                sys.index_columns ic 
                   ON c.object_id = ic.object_id AND ic.column_id = c.column_id AND ic.Is_Included_Column = 1
             WHERE
                indexCTE.OBJECT_ID = ic.object_id 
                AND indexCTE.index_id = ic.index_id 
             FOR XML PATH('')
            ), '') includedcols
        FROM 
            indexCTE
    ) 
    SELECT 
        'CREATE ' + IndexType + ' INDEX ' + IndexName + ' ON ' + TableName + 
            '(' + SUBSTRING(ixcols, 1, LEN(ixcols)-1) + 
            CASE LEN(includedcols)
              WHEN 0 THEN ')'
              ELSE ') INCLUDE (' + SUBSTRING(includedcols, 1, LEN(includedcols)-1) + ')'
            END
    FROM 
       indexCTE2
    ORDER BY 
       TableName, IndexName
    

    CREATE INDEX を取得しますか? 探しているステートメント??

    マーク



    1. PLS-00103:+ &=などを期待しているときに記号ENDが見つかりました

    2. SQL Server 2005 で DateTime から分を引く

    3. 条件ステートメントをmySqlクエリに渡す方法

    4. SQL Server データベースのコピーに関する質問