求sql语句:提取某个数据库中所有表的索引名

时间:2022-03-01 13:45:11
这是一个考试题:不能用sys.indexes,用游标的方法实现提取sys.tables中所有表对应的index名称,索引名称在sp_helpindex中有。结果是四个字段,一个是表名,其他的是sp_helpindex查出来的字段。

请各位大侠指教~~ 

3 个解决方案

#1


自己顶一下~~

#2


SqlServer数据库字典--索引.sql

SELECT TOP 100 PERCENT --a.id, 

CASE WHEN b.keyno = 1 THEN c.name ELSE '' END AS 表名, 

CASE WHEN b.keyno = 1 THEN a.name ELSE '' END AS 索引名称, d.name AS 列名, 

b.keyno AS 索引顺序, CASE indexkey_property(c.id, b.indid, b.keyno, 'isdescending') 

WHEN 1 THEN '降序' WHEN 0 THEN '升序' END AS 排序, CASE WHEN p.id IS NULL 

THEN '' ELSE '√' END AS 主键, CASE INDEXPROPERTY(c.id, a.name, 'IsClustered') 

WHEN 1 THEN '√' WHEN 0 THEN '' END AS 聚集, CASE INDEXPROPERTY(c.id, 

a.name, 'IsUnique') WHEN 1 THEN '√' WHEN 0 THEN '' END AS 唯一, 

CASE WHEN e.id IS NULL THEN '' ELSE '√' END AS 唯一约束, 

a.OrigFillFactor AS 填充因子, c.crdate AS 创建时间, c.refdate AS 更改时间 

FROM dbo.sysindexes a INNER JOIN 

dbo.sysindexkeys b ON a.id = b.id AND a.indid = b.indid INNER JOIN 

dbo.syscolumns d ON b.id = d.id AND b.colid = d.colid INNER JOIN 

dbo.sysobjects c ON a.id = c.id AND c.xtype = 'U' LEFT OUTER JOIN 

dbo.sysobjects e ON e.name = a.name AND e.xtype = 'UQ' LEFT OUTER JOIN 

dbo.sysobjects p ON p.name = a.name AND p.xtype = 'PK' 

WHERE (OBJECTPROPERTY(a.id, N'IsUserTable') = 1) AND (OBJECTPROPERTY(a.id, 

N'IsMSShipped') = 0) AND (INDEXPROPERTY(a.id, a.name, 'IsAutoStatistics') = 0) 

ORDER BY c.name, a.name, b.keyno

#3


该回复于2010-12-10 09:07:59被版主删除

#1


自己顶一下~~

#2


SqlServer数据库字典--索引.sql

SELECT TOP 100 PERCENT --a.id, 

CASE WHEN b.keyno = 1 THEN c.name ELSE '' END AS 表名, 

CASE WHEN b.keyno = 1 THEN a.name ELSE '' END AS 索引名称, d.name AS 列名, 

b.keyno AS 索引顺序, CASE indexkey_property(c.id, b.indid, b.keyno, 'isdescending') 

WHEN 1 THEN '降序' WHEN 0 THEN '升序' END AS 排序, CASE WHEN p.id IS NULL 

THEN '' ELSE '√' END AS 主键, CASE INDEXPROPERTY(c.id, a.name, 'IsClustered') 

WHEN 1 THEN '√' WHEN 0 THEN '' END AS 聚集, CASE INDEXPROPERTY(c.id, 

a.name, 'IsUnique') WHEN 1 THEN '√' WHEN 0 THEN '' END AS 唯一, 

CASE WHEN e.id IS NULL THEN '' ELSE '√' END AS 唯一约束, 

a.OrigFillFactor AS 填充因子, c.crdate AS 创建时间, c.refdate AS 更改时间 

FROM dbo.sysindexes a INNER JOIN 

dbo.sysindexkeys b ON a.id = b.id AND a.indid = b.indid INNER JOIN 

dbo.syscolumns d ON b.id = d.id AND b.colid = d.colid INNER JOIN 

dbo.sysobjects c ON a.id = c.id AND c.xtype = 'U' LEFT OUTER JOIN 

dbo.sysobjects e ON e.name = a.name AND e.xtype = 'UQ' LEFT OUTER JOIN 

dbo.sysobjects p ON p.name = a.name AND p.xtype = 'PK' 

WHERE (OBJECTPROPERTY(a.id, N'IsUserTable') = 1) AND (OBJECTPROPERTY(a.id, 

N'IsMSShipped') = 0) AND (INDEXPROPERTY(a.id, a.name, 'IsAutoStatistics') = 0) 

ORDER BY c.name, a.name, b.keyno

#3


该回复于2010-12-10 09:07:59被版主删除