SQL:打印表索引脚本

SQL SERVER 打印索引脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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 @   samrv  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示