2013-04-15 11 views
6

Ist es möglich, eine Abfrage zu schreiben, die alle Tabellen zurückgibt, die gruppierte Indizes enthalten, die nicht auf einem Identitätsschlüssel basieren?SQL Server-Abfrage zum Auffinden geclusterter Indizes

+0

Sie haben noch nichts versucht. Die Meta-Tabellen sys.indexes und sys.index_columns und sys.columns sind ein Startpunkt. –

+2

Können Sie klären? Möchten Sie alle Tabellen, die nicht * nur * in der IDENTITY-Spalte gruppiert sind, oder alle Tabellen, die die IDENTITY-Spalte nicht enthalten, an beliebiger Stelle im Clustered-Index? –

+0

Aaron, ich denke, was mich interessiert, ist jeder geclusterte Index, der nicht nur ein Identitätsschlüssel ist. – DevilDog

Antwort

9

Wie wäre es damit:

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, diese Abfrage werden diese Primärschlüssel auflisten, die eine Spalte haben, die nicht Identität ist, aber wo gibt es auch zusätzlich eine zweite Spalte in der Primärschlüsselbedingung, dass IS eine IDENTITY Spalte.

+0

Marc, nein, ich möchte die gruppierten Indizes kennen, die sich aus einem Identitätsschlüssel und etwas anderem zusammensetzten – DevilDog

+0

@DevilDog : aktualisierte meine Antwort - sollte jetzt Ihre Anforderungen behandeln –

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; 

Beispielausgabe (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

folgende Abfrage erhalten Sie alle Benutzer Tabellen, Spalten, Datentyp, und wenn die Spalte Teil des Cluster-Index ist, wird es Spalte Sequenz zurückkehren/Reihenfolge im verkrusteten Index andernfalls wird NULL zurückgegeben.

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