Piotr Kononow's post List all indexes in SQL Server database contains an example of SQL query to list all indexes in a SQL Server database. And we have confirmed in testing that the example works indeed.
To fully understand the query, we have a question regarding the below cross apply
section, please also refer to the full query included in the details at the end.
cross apply (
...
) D (column_names)
Our Question:
What does it mean by the D
and D (column_names)
?
We highly appreciate any hints and suggestions.
Details: the full sample SQL query:
--Reference:
-- https://dataedo.com/kb/query/sql-server/list-all-indexes-in-the-database
select
i.[name] as [index_name]
, substring(column_names, 1, len(column_names)-1) as [columns]
, case
when i.[type] = 1 then 'Clustered index'
when i.[type] = 2 then 'Nonclustered unique index'
when i.[type] = 3 then 'XML index'
when i.[type] = 4 then 'Spatial index'
when i.[type] = 5 then 'Clustered columnstore index'
when i.[type] = 6 then 'Nonclustered columnstore index'
when i.[type] = 7 then 'Nonclustered hash index'
else 'ERROR'
end as [index_type]
, case
when i.is_unique = 1 then 'Unique'
else 'Not unique'
end as [unique]
, '['+schema_name(t.schema_id)+'].['+t.[name]+']' as [table_view]
, case
when t.[type] = 'U' then 'Table'
when t.[type] = 'V' then 'View'
end as [object_type]
from
sys.objects t
inner join sys.indexes i
on t.object_id = i.object_id
cross apply (
select
col.[name]+', '
from
sys.index_columns ic
inner join sys.columns col
on ic.object_id = col.object_id and ic.column_id = col.column_id
where
ic.object_id = t.object_id
and ic.index_id = i.index_id
order by key_ordinal
for xml path ('')
) D (column_names)
where
t.is_ms_shipped <> 1
and index_id > 0
order by i.[name]
;
[ [ AS ] table_alias ] [ (column_alias [ , ...n ] ) ]
for xml
for aggregation, but it's not doing XML unescaping. It should beselect ', ' + col.name
andfor xml path (''), type)
and, stuff(column_names, 1, 2, '') as [columns]
. Or on newer versions of SQL Server, just useSTRING_AGG