Я вошел в ваш исходный оператор sql и получил его для возврата xtype
для индекса из таблицы sysobjects
:
select tbl.name,idx.name as indexname,t1.*,col.name as colname, tbl2.xtype
from dbo.sysindexkeys as t1
LEFT JOIN dbo.sysindexes as idx on (t1.id=idx.id and t1.indid=idx.indid)
LEFT JOIN dbo.syscolumns as col on (col.id=t1.id and col.colid=t1.colid)
LEFT JOIN dbo.sysobjects as tbl on (idx.id=tbl.id)
JOIN dbo.sysobjects AS tbl2 ON (idx.id = tbl2.parent_obj) AND (idx.name = tbl2.name)
ORDER BY tbl.name,idx.name,t1.keyno
idx.id
- это идентификатор таблицы индексаотносится к.В таблице sysobjects
нет ничего, кроме поля имени, совпадающего с тем, что находится в таблице sysindexes
, поэтому к нему тоже нужно было присоединиться.Почти сделал еще одно левое соединение, но когда я это сделал, я получил строки из индексной таблицы для объектов статистики, которые не перечислены в таблице sysobjects
.
РЕДАКТИРОВАТЬ: я вернулся и посмотрел, что потребуется, чтобыполучить информацию, которую вы ищете, и придумал следующую инструкцию SQL:
SELECT name, indexname, id, indid, colid, keyno, colname,
ISNULL(xtype, CASE WHEN is_index = 1 THEN 'IX' WHEN status&2 <> 0 THEN 'UQ' ELSE xtype END) as xtype
FROM
(select TOP 100 PERCENT
tbl.name,
idx.name as indexname,
t1.*,
col.name as colname,
idx.status,
CAST(CASE WHEN (idx.status=0 OR idx.status&5<>0) THEN 1 ELSE 0 END AS bit) AS is_index,
CAST(CASE WHEN idx.status&64<>0 THEN 1 ELSE 0 END AS bit) AS is_statistic,
tbl2.xtype
from dbo.sysindexkeys as t1
LEFT JOIN dbo.sysindexes as idx on (t1.id=idx.id and t1.indid=idx.indid)
LEFT JOIN dbo.syscolumns as col on (col.id=t1.id and col.colid=t1.colid)
LEFT JOIN dbo.sysobjects as tbl on (idx.id=tbl.id)
LEFT JOIN dbo.sysobjects AS tbl2 ON (idx.id = tbl2.parent_obj) AND (idx.name = tbl2.name)
ORDER BY tbl.name,idx.name,t1.keyno) AS dts
WHERE is_statistic = 0
Я не уверен, как заставить отображаться типы 'D'
, поскольку их нет в таблице sysindexkeys
..