2017-10-27 15 views
1

T-SQLスクリプトを探しています。これは、インデックスの名前が正しく設定されていることを確認できます。SQL Serverインデックス - 命名規則を確認します

PK_ for primary keys 
UK_ for unique keys 
IX_ for non clustered non unique indexes 
UX_ for unique indexes 

さらに、インデックス(トリッキーな部分)の命名:このタイプのスクリプトとそこ

IX_Column1_Column2 - instead of IX_CrazyIndexWhichFixesPerformance 

誰か?

+1

それは*アスカのように見える私に@HoneyBadgerは*規則を持っている、とするスクリプトを望んでいます*それが追跡されていることを確認する* ... – AakashM

+0

Correct @AakashM –

答えて

0

私はこれで終わった - それはかなりではないかもしれませんがために仕事を取得し、今:-)

WITH indexesCTE 
AS 
(
    SELECT 
     t.name AS TableName 
     , i.name AS IndexName 
     , i.index_id AS IndexId 
     , ic.index_column_id AS ColumnId 
     , t.object_id AS TableId 
     , REPLACE(c.name, '_', '') AS ColumnName 
     , i.object_id AS IndexObjectId 
    FROM sys.indexes i 
    INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id and i.index_id = ic.index_id 
    INNER JOIN sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id 
    INNER JOIN sys.tables t ON i.object_id = t.object_id 
    WHERE 
     i.is_primary_key = 0 
     AND i.is_unique = 0 
     AND i.is_unique_constraint = 0 
     AND t.is_ms_shipped = 0 
) 
, indexNameProposal 
AS 
(
SELECT i.TableName 
     , i.IndexName AS CurrentIndexName 
     , 'IX' + STUFF((SELECT '_' + i2.ColumnName FROM indexesCTE i2 WHERE i2.IndexId = i.IndexId AND i.TableId = i2.TableId FOR XML PATH('')),1,0,'') AS IndexNameProposal 
     FROM indexesCTE i 
     GROUP BY i.TableName, i.IndexName, i.TableId, i.IndexId 
) 
SELECT 
    * 
    FROM indexNameProposal i 
    WHERE i.CurrentIndexName <> i.IndexNameProposal 
1

これは、オブジェクトカタログビュー(sys。*)を使用して簡単に実行できます。

これはどのようにアプローチしたいかによって異なります。これらのすべてをチェックするための完全な手順を書くことができます。私は正確に上記を行うコードはありませんが、これは正しい軌道にあなたを設定する必要があります。主キーのチェックのため

、あなたがあなたの命名規則に適合しない主キーを見つけることができます:それは、特定のキーの制約のためにフィルタリングするsys.objectsテーブルを使用しての質問になります

SELECT distinct 
i.name AS index_name, 
i.object_id 
from 
sys.indexes i 
where 
i.is_primary_key = 1 
and i.name not like 'PK_%' 

を。列の場合

sys.index_columnssys.columnsを通じて参加:

SELECT distinct 
c.name AS column_name, 
i.name AS index_name, 
i.object_id 
from 
sys.indexes i 
inner join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
inner join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id 

使用すると、1つのフィールドに列名を連結するように、あなたはFOR XML PATH('')

にこの情報プラスの慎重な操作を見てする必要がありますこれらのチェックを実行できるようにする必要があります。