0
点赞
收藏
分享

微信扫一扫

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

彭维盛 2022-02-26 阅读 58
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;
举报

相关推荐

0 条评论