sql server 索引检测

-- 声明表变量
DECLARE @userTable TABLE (table_name NVARCHAR(20));

-- 将源表中的数据插入到表变量中
INSERT INTO @userTable(table_name) SELECT name FROM sysobjects WHERE xtype = 'U' AND name LIKE 'user_[1234567890]%';

-- 声明变量
DECLARE @sql NVARCHAR(MAX),@index_name NVARCHAR(30),@table_name NVARCHAR(20);
WHILE EXISTS(SELECT table_name FROM @userTable)
    BEGIN
        SELECT @table_name = table_name FROM @userTable ORDER BY table_name;
        BEGIN TRY
            --检查索引
            SET @index_name = 'IX_' + @table_name;
            IF NOT EXISTS(SELECT 1 FROM sysindexes a 
                                   JOIN sysindexkeys b ON a.id = b.id AND a.indid = b.indid 
                                   JOIN sysobjects c ON b.id = c.id
                                   JOIN syscolumns d ON b.id = d.id AND b.colid = d.colid
                                   WHERE a.indid NOT IN(0,255) AND c.xtype = 'U' AND c.name = @table_name AND a.name = @index_name)
            BEGIN
                SET @sql='CREATE NONCLUSTERED INDEX '+@index_name+' ON '+@table_name+'(userId ASC)
                          INCLUDE(id,......)
                          WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'
                EXEC (@sql);
            END
            --检查唯一索引
            SET @index_name='IXDistinct_' + @table_name;
            IF NOT EXISTS(SELECT 1 FROM sysindexes a 
                                   JOIN sysindexkeys b ON a.id=b.id AND a.indid=b.indid 
                                   JOIN sysobjects c ON b.id=c.id 
                                   JOIN syscolumns d ON b.id=d.id AND b.colid=d.colid
                                   WHERE a.indid NOT IN(0,255) AND c.xtype='U' AND c.name=@table_name AND a.name=@index_name)
        BEGIN
            SET @sql='ALTER TABLE ' + @table_name + ' ADD  CONSTRAINT '+@index_name+' UNIQUE NONCLUSTERED(userId ASC,.....)
                      WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'
            EXEC (@sql);
            EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'userId和....组成的唯一键索引' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=@table_name, @level2type=N'CONSTRAINT',@level2name=@index_name
        END
        END TRY
        BEGIN CATCH
          SELECT @table_name AS tablename,
              ERROR_MESSAGE() AS ErrorMessage,
                 ERROR_SEVERITY() AS ErrorSeverity,
                 ERROR_STATE() AS ErrorState    
        END CATCH 
        DELETE FROM @userTable WHERE table_name=@table_name;
    END
原文地址:https://www.cnblogs.com/zhm001/p/14543167.html