2013-04-15 27 views
6

Kimlik anahtarına dayalı olmayan kümelenmiş dizinleri olan tüm tabloları döndüren bir sorgu yazmak mümkün mü?Kümelenmiş dizinleri bulmak için SQL Server sorgusu

+0

Henüz bir şey denediniz. Meta tablolar sys.indexes ve sys.index_columns ve sys.columns başlamak için bir yer olacaktır. –

+2

Netleştirebilir misiniz? Kümelenmemiş tüm tabloların * sadece * IDENTITY sütununu veya kümelenmiş dizinin herhangi bir yerindeki IDENTITY sütununu içermeyen tüm tabloları istiyor musunuz? –

+0

Aaron, ben sadece ilgilendiğim bir kimlik anahtar – DevilDog

cevap

9
bu konuda nasıl

:

SELECT 
    TableName = t.name, 
    ClusteredIndexName = i.name, 
    ColumnName = c.Name 
FROM 
    sys.tables t 
INNER JOIN 
    sys.indexes i ON t.object_id = i.object_id 
INNER JOIN 
    sys.index_columns ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id 
INNER JOIN 
    sys.columns c ON ic.column_id = c.column_id AND ic.object_id = c.object_id 
WHERE 
    i.index_id = 1 -- clustered index 
    AND c.is_identity = 0 
    AND EXISTS (SELECT * 
       FROM sys.columns c2 
       WHERE ic.object_id = c2.object_id AND c2.is_identity = 1) 

OK, bu sorgu değil kimlik olan bir sütuna sahip olan birincil anahtarları listelemek getirecek ve aynı zamanda da birincil anahtar kısıtlaması ikinci sütun olduğu yerde bir IDENTITY sütunudur.

+0

Marc, kümelenmiş bir dizin değil, ben bir kimlik anahtar ve başka bir şeyden oluşan bu kümelenmiş dizinleri bilmek istiyorum bir şey – DevilDog

+0

@DevilDog : yanıtımı güncelledi - gereksinimlerinizi şimdi ele almalı –

5
SELECT s.name AS schema_name, o.name AS object_name, i.name AS index_name 
FROM sys.indexes i 
JOIN sys.objects o ON i.object_id = o.object_id 
JOIN sys.schemas s ON o.schema_id = s.schema_id 
WHERE i.type = 1 -- Clustered index 
--AND  o.is_ms_shipped = 0 -- Uncomment if you want to see only user objects 
AND  NOT EXISTS (
    SELECT * 
    FROM sys.index_columns ic INNER JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id 
    WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id 
    AND  c.is_identity = 1 -- Is identity column 
) 
ORDER BY schema_name, object_name, index_name; 

Örnek çıktı (AdventureWorks2008R2):

schema_name object_name     index_name 
-------------- --------------------------- -------------------------------------------------------------------- 
HumanResources Employee     PK_Employee_BusinessEntityID 
HumanResources EmployeeDepartmentHistory PK_EmployeeDepartmentHistory_BusinessEntityID_StartDate_DepartmentID 
HumanResources EmployeePayHistory   PK_EmployeePayHistory_BusinessEntityID_RateChangeDate 
Person   BusinessEntityAddress  PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID 
Person   BusinessEntityContact  PK_BusinessEntityContact_BusinessEntityID_PersonID_ContactTypeID 
0

ardından sorgu size tüm kullanıcı tabloları, sütunlar, veri türü verecek ve sütun küme endeksi parçası ise o/sütunun dizisini döndürür kabuklu dizinde siparişi tersine NULL döndürür.

SELECT U.name [OWNER],O.name [TABLE_NAME],C.name [COLUMN_NAME],T.name [DATA_TYPE],C.length [DATA_LENGTH], x.keyno [Primary_Key_order] 
FROM syscolumns C 
inner join sysobjects O on O.Id=C.Id and o.xtype='U' -- User Tables 
inner join sysusers U on O.Uid=U.UID 
inner join systypes T on C.xtype=T.xtype 
left outer join (Select O.name [TABLE_NAME] , C.name [COLUMN_NAME], IK.keyno 
      from syscolumns C 
      inner join sysobjects O on O.Id=C.Id and O.xtype='U' -- User Tables 
      join sysindexkeys IK on O.id=IK.ID and C.colid=IK.COLID and Indid=1 -- Only Clustered Index 
      ) x 
      on x.TABLE_NAME=O.name and X.COLUMN_NAME=C.name 
order by U.name