SQL:打印表索引脚本

SQL SERVER 打印索引脚本

declare C1 cursor  for 
 -- 表索引,不包含主约束索引。 
 SELECT OBJ.OBJECT_ID AS [TABLE_ID], 
    OBJ.NAME AS [TABLE_NAME],
  --  PK.name AS CONSTRAIN_NAME,
    idx.name as index_name,
    --索引类型: 聚集索引、非聚集索引
    case WHEN idx.type = 1 then 'CLUSTERED' 
     when idx.type=2 then 'NONCLUSTERED' 
     ELSE '' END AS [INDEX_TYPE],
    CASE WHEN IDX.is_unique=1 THEN  'UNIQUE' 
    WHEN IDX.is_unique=0 THEN '不唯一'
    ELSE  '' END [IS_UNIQUE_DESC]
   -- IDXC.index_column_id,
  --  IDXC.key_ordinal,
  --  COL.name AS COLUMN_NAME
   -- ,IDX.* 
  FROM SYS.all_objects OBJ,
     --  SYS.key_constraints PK,
       sys.indexes idx
      -- sys.index_columns idxc,
      -- SYS.all_columns COL
  WHERE OBJ.type='U'
  AND OBJ.name LIKE 'AP_Vouch%'
 -- AND OBJ.object_id = PK.parent_object_id 
 -- AND PK.type='PK'
 -- and pk.parent_object_id = idx.object_id
 -- and pk.unique_index_id = idx.index_id
  and not exists ( select 1 from  SYS.key_constraints PK
   where  pk.parent_object_id = idx.object_id 
    and pk.unique_index_id = idx.index_id )
  and obj.object_id = idx.object_id
 -- AND IDX.object_id = IDXC.object_id
 -- and idx.index_id = idxc.index_id
 -- AND IDXC.object_id = COL.object_id
  --and IDXC.column_id = COL.column_id
order by  OBJ.NAME, idx.name --,IDXC.key_ordinal
;
DECLARE @TABLE_ID BIGINT,
  @TABLE_NAME NVARCHAR(128),
  @INDEX_NAME NVARCHAR(128),
  @INDEX_TYPE NVARCHAR(128),
  @IS_UNIQUE_DESC NVARCHAR(128),
  @KEY_ORDINAL INT,
  @COLUMN_NAME NVARCHAR(128),
  @RESULT NVARCHAR(4000),
  @COLUMN_LIST NVARCHAR(4000),
  @UNIQUE NVARCHAR(20);
declare @fetch_status1 int;
declare @fetch_status_idx int;  
BEGIN
  OPEN C1 ;
  FETCH NEXT FROM C1 INTO @TABLE_ID, @TABLE_NAME, @INDEX_NAME, @INDEX_TYPE,@IS_UNIQUE_DESC--, @KEY_ORDINAL ,@COLUMN_NAME; 
  set @fetch_status1 =@@FETCH_STATUS
  WHILE @FETCH_STATUS1 = 0
  BEGIN
    IF @IS_UNIQUE_DESC = 'UNIQUE' 
       SET @UNIQUE = ' UNIQUE ';
    ELSE 
       SET @UNIQUE =' ';
    
    SET @COLUMN_LIST ='';
    -- 索引字段
    declare c_idxc cursor for
     select IDXC.key_ordinal,
            COL.name AS COLUMN_NAME
      from sys.indexes idx,
           sys.index_columns idxc,
       SYS.all_columns COL
       where IDXC.object_id = COL.object_id
        and IDXC.column_id = COL.column_id
        AND IDX.index_id = IDXC.index_id
        and idxc.object_id = @table_id
        AND IDX.name = @INDEX_NAME
        ORDER BY IDXC.key_ordinal;
      open c_idxc ;
      fetch next from c_idxc into  @key_ordinal, @column_name 
      set @fetch_status_idx = @@FETCH_STATUS 
      while @fetch_status_idx = 0
      begin
        set @COLUMN_LIST = @COLUMN_LIST + @COLUMN_NAME + ',';
        fetch next from c_idxc into  @key_ordinal, @column_name 
        set @fetch_status_idx = @@FETCH_STATUS 
      end;
      close c_idxc;
      deallocate c_idxc;

      IF @COLUMN_LIST!=''  
        SET @COLUMN_LIST = LEFT(@COLUMN_LIST,LEN(@COLUMN_LIST)-1);
      
    SET @RESULT='CREATE '+ @UNIQUE + @INDEX_TYPE +' INDEX '+ @INDEX_NAME +' ON '+ @TABLE_NAME 
     + '( '+ @COLUMN_LIST + ' );'+CHAR(13);
     PRINT @RESULT; 
    -- PRINT 'GO'; 
    FETCH NEXT FROM C1 INTO @TABLE_ID, @TABLE_NAME, @INDEX_NAME, @INDEX_TYPE,@IS_UNIQUE_DESC--, @KEY_ORDINAL ,@COLUMN_NAME ;
    set @fetch_status1 = @@FETCH_STATUS;
  END ;
   
  CLOSE C1;
  DEALLOCATE C1;

END ;

  

posted @ 2023-08-13 11:57  samrv  阅读(19)  评论(0编辑  收藏  举报