2010-02-22 18 views
7

SQL Server'da foreign key does not automatically create an index olarak görünme, veritabanımdaki her FK alanında açık bir dizin oluşturmak istiyorum. Ve şemada 100'den fazla tablo var ...Her yabancı tuşa bir dizin eklemek için komut dosyası mı?

Herkes, tüm FK'leri algılamak ve her birinde bir dizin oluşturmak için kullanabileceğim hazır bir paketli komut dosyası var mı?

+1

Heh, hafta sonunu yaptım ve iptal ettim. Adlandırma kuralıma göre özelleştirildi, bu yüzden çok sayıda dize işlemi yaptım ve schema_name (schema_id) ve object_name (parent_object_id) ile sys.foreign_keys'den seçtim. –

cevap

7

Tamam, kendimi bu iş çıktı - burada herkesin yararına olduğunu ...

select 'create index IX_'+c.name+'_'+p.name+' on '+c.name+'('+cf.name+');' 
from sysforeignkeys fk join sysobjects c on fk.fkeyid=c.id 
join sysobjects p on fk.rkeyid=p.id 
join syscolumns cf on c.id=cf.id and cf.colid = fk.fkey 
left join sysindexkeys k on k.id = cf.id and k.colid = cf.colid 
where k.id is null 
order by c.name 

Böyle aynı bir masada iki FKS var sanki,% 100 çalışmıyor Birincil tablo, ama bunun için yeterince az sayıda örnek var (DB'mde en azından) bunları el ile düzeltebiliyorum.

3

Sistem görünümlerini kullanmak için sorguyu değiştirdim. Ayrıca masadaki her FK'yi sadece bir tane değil de beter.

SELECT 'CREATE NONCLUSTERED INDEX ndx_' + o.name + '__' + c.name 
    + ' ON ' + o.name + ' (' + c.name + ')' 
FROM sys.foreign_keys  fk 
JOIN sys.objects    o ON fk.parent_object_id = o.object_id 
JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
JOIN sys.columns    c ON fkc.parent_object_id = c.object_id 
           AND fkc.parent_column_id = c.column_id 
ORDER BY o.name 
+0

Bu güzel, sadece bir sütun kullanıcısı (sadece bana oldu) adında birinin isimleri etrafında kare köşeli ayraçlar ekleyeceğim. – vercelli

6

Tamam, işte bu benim için. Şemalar için destek ekledim ve ayrıca geçerli adlandırma kuralıyla bir dizinin var olup olmadığını kontrol ettim. Bu şekilde tablolarınızı değiştirdiğinizde eksik dizinleri kontrol edebilirsiniz.

SELECT 'CREATE NONCLUSTERED INDEX IX_' + s.NAME + '_' + o.NAME + '__' + c.NAME + ' ON ' + s.NAME + '.' + o.NAME + ' (' + c.NAME + ')' 
    FROM sys.foreign_keys fk 
    INNER JOIN sys.objects o ON fk.parent_object_id = o.object_id 
    INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
    INNER JOIN sys.columns c ON fkc.parent_object_id = c.object_id 
     AND fkc.parent_column_id = c.column_id 
    INNER JOIN sys.tables t ON t.object_id = o.object_id 
    INNER JOIN sys.schemas s ON s.schema_id = t.schema_id 
    LEFT JOIN sys.indexes i ON i.NAME = ('IX_' + s.NAME + '_' + o.NAME + '__' + c.NAME) 
    WHERE i.NAME IS NULL 
    ORDER BY o.NAME 
+0

Bu harika, gönderdiğiniz için teşekkürler. – udog

İlgili konular