Czy można napisać zapytanie zwracające wszystkie tabele z indeksami klastrowanymi, które nie są oparte na kluczu tożsamości?Zapytanie SQL Server o indeksy klastrowane
Odpowiedz
Jak o tym:
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, ta kwerenda będzie lista tych kluczy podstawowych, które mają kolumnę, która jest nie tożsamość, ale gdzie tam także dodatkowo druga kolumna w klucz podstawowy tego IS kolumna .
Marc, nie, chciałbym poznać te indeksy klastrowe, które składają się z klucza tożsamości i czegoś innego. – DevilDog
@DevilDog : zaktualizowałem moją odpowiedź - teraz powinienem radzić sobie z Twoimi wymaganiami –
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;
Przykładowe wyjście (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
następujące zapytanie daje wszystkie tabele użytkownika, kolumny, typ danych, a jeżeli kolumna jest częścią indeksu klastra powróci sekwencję kolumny/kolejność w skorupie indeksu inaczej zwróci wartość NULL.
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
Próbowałeś jeszcze czegoś. Meta tabele sys.indexes i sys.index_columns i sys.columns będą miejscem do uruchomienia. –
Czy możesz wyjaśnić? Czy chcesz, aby wszystkie tabele, które nie są klastrowane w * tylko *, w kolumnie IDENTYFIKACJA, lub we wszystkich tabelach, które nie zawierają kolumny IDENTITY w dowolnym miejscu indeksu klastrowanego? –
Aaron, myślę, że interesuje mnie jakikolwiek indeks klastrowany, który nie jest wyłącznie kluczem tożsamości – DevilDog