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
Antwort
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.
Marc, nein, ich möchte die gruppierten Indizes kennen, die sich aus einem Identitätsschlüssel und etwas anderem zusammensetzten – DevilDog
@DevilDog : aktualisierte meine Antwort - sollte jetzt Ihre Anforderungen behandeln –
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
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
Sie haben noch nichts versucht. Die Meta-Tabellen sys.indexes und sys.index_columns und sys.columns sind ein Startpunkt. –
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? –
Aaron, ich denke, was mich interessiert, ist jeder geclusterte Index, der nicht nur ein Identitätsschlüssel ist. – DevilDog