SQL生成全库或某张表全部索引对应关系和创建语句

DECLARE @tabname varchar(50)
set @tabname='bill'--表名
if ( object_id('tempdb.dbo.#IDX') is not null)
begin
DROP TABLE #idx
end
SELECT a.name as IndexName,
c.name as TableName,
d.name as IndexColumn,
i.is_primary_key,--为主键=1,其他为0
-- i.is_unique_constraint, --唯一约束=1,其他为0
i.type,
b.keyno, --列的次序,0为include的列
s.name as schemaName
into #idx
FROM sysindexes a
INNER JOIN sys.tables t ON a.id = t.object_id
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN sysindexkeys b ON a.id = b.id AND a.indid = b.indid
INNER JOIN sysobjects c ON b.id = c.id
INNER JOIN syscolumns d ON b.id = d.id AND b.colid = d.colid
INNER join sys.indexes i
on i.index_id=a.indid and c.id=i.object_id
WHERE a.indid NOT IN (0, 255) --indid = 0 或 255则为表,其他为索引。
-- and c.xtype='U' /*U = 用户表*/ and c.status>0 --查所有用户表
-- AND c.name = @tabname --只查指定表
and c.type = 'U' --S = 系统表
ORDER BY c.name, a.name,b.keyno asc
-- 查询表、字段、索引
SELECT * from #idx where tablename='bill'
--select * from sys.indexes
--select * from sysindexkeys
--select * from sysobjects
--select * from sys.tables
--select * from sys.SCHEMAs
-- select * from syscolumns
-- select * from sysindexes
--sp_help clientcardinfo
-- 生成全库索引创建语句
select case
when is_primary_key=1 then 'ALTER TABLE ['+ TableName +'] ADD CONSTRAINT ['+INDEXNAME+'] PRIMARY KEY ('+IndexColumn+')'
when type=1 then 'CREATE CLUSTERED INDEX [' + INDEXNAME + ']' +' ON [' + schemaName + '].[' + TableName + '] ' + '(' + IndexColumn + ' ASC)'
else 'CREATE NONCLUSTERED INDEX [' + INDEXNAME + ']' +' ON [' + schemaName + '].[' + TableName + '] ' + '(' + IndexColumn + ' ASC)' end INDEX_DDL
from #idx
-- select case
-- when a.is_primary_key=1 then 'ALTER TABLE '+a.tablename+' ADD CONSTRAINT '+a.indexname+' PRIMARY KEY ('+a.IndexColumn+')'
-- when a.is_unique_constraint=1 then 'ALTER TABLE '+a.tablename+' ADD CONSTRAINT '+a.indexname+' UNIQUE NONCLUSTERED('+a.IndexColumn+') WITH(ONLINE=ON,FillFactor=90)'
-- else 'create index '+a.indexname+' on '+a.tablename+'('+a.IndexColumn+') '+
-- (case when b.IndexColumn is null then '' else 'include('+b.IndexColumn+') ' end)+'WITH(ONLINE=ON,FillFactor=90)' end INDEX_DDL
-- from #IDX2 a left join #IDX3 b on a.indexname=b.indexname
-- where a.is_primary_key=0 --去掉主键
-- select * FROM #IDX2;

posted @   IT情深  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示