2016-11-14 2 views
0

У меня есть запрос на создание курсора, который анализирует временную таблицу, которая содержит список имен индексов, и создает сценарий создания для каждого имени, найденного в временных таблицах, и сохраняет они создают индексы в другую временную таблицу. Провел полдня, пробовал это безрезультатно. Любое предложение очень ценится.Как получить скрипт создания индекса, когда вы знаете его имя

+0

pelaseshow некоторые данные образца и ожидаемый вывод – TheGameiswar

+0

Щелкните правой кнопкой мыши-> Создать сценарий в SSMS. –

ответ

1

Я скомпилировал это из разных источников некоторое время назад, он должен дать вам сценарии создания и удаления для всех индексов в базе данных;

/* Check if our first temp table already exists and drop if so */ 

IF OBJECT_ID('tempdb..#CreateIndexes') IS NOT NULL DROP TABLE #CreateIndexes 
GO 

/* Let's declare some variables shall we */ 

declare @SchemaName varchar(100)declare @TableName varchar(256) 
declare @IndexName varchar(256) 
declare @ColumnName varchar(100) 
declare @is_unique varchar(100) 
declare @IndexTypeDesc varchar(100) 
declare @FileGroupName varchar(100) 
declare @is_disabled varchar(100) 
declare @IndexOptions varchar(max) 
declare @IndexColumnId int 
declare @IsDescendingKey int 
declare @IsIncludedColumn int 
declare @TSQLScripCreationIndex varchar(max) 
declare @TSQLScripDisableIndex varchar(max) 

/* Make a table to insert our results into */ 

CREATE TABLE #CreateIndexes (
          SchemaName varchar(max) 
          ,TableName varchar(max) 
          ,IndexName varchar(max) 
          ,is_unique varchar(max) 
          ,IndexTypeDesc varchar(max) 
          ,is_disabled varchar(max) 
          ,FileGroupName varchar(max) 
          ,DropScript varchar(max) 
          ,TSQLScripCreationIndex varchar(max) 
          ,TSQLScripDisableIndex varchar(max) 
          ,TSQLDropIndex varchar(max) 
          ) 

/* Cursor *shudder* to gather index info, make our create scripts and push into our temp table */ 

DECLARE CursorIndex CURSOR FOR 
SELECT 
    schema_name(t.schema_id) [schema_name] 
    ,t.name 
    ,ix.name 
    ,CASE 
     WHEN ix.is_unique = 1 
      THEN 'UNIQUE ' 
     ELSE '' 
    END 
    ,ix.type_desc 
    , CASE 
      WHEN ix.is_padded=1 
       THEN 'PAD_INDEX = ON, ' 
      ELSE 'PAD_INDEX = OFF, ' 
     END 
     + 
     CASE 
      WHEN ix.allow_page_locks=1 
       THEN 'ALLOW_PAGE_LOCKS = ON, ' 
      ELSE 'ALLOW_PAGE_LOCKS = OFF, ' 
     END 
     + 
     CASE 
      WHEN ix.allow_row_locks=1 
       THEN 'ALLOW_ROW_LOCKS = ON, ' 
      ELSE 'ALLOW_ROW_LOCKS = OFF, ' 
     END 
     + 
     CASE 
      WHEN INDEXPROPERTY(t.object_id, ix.name, 'IsStatistics') = 1 
       THEN 'STATISTICS_NORECOMPUTE = ON, ' 
      ELSE 'STATISTICS_NORECOMPUTE = OFF, ' 
     END 
     + 
     CASE 
      WHEN ix.ignore_dup_key=1 
       THEN 'IGNORE_DUP_KEY = ON, ' 
      ELSE 'IGNORE_DUP_KEY = OFF, ' 
     END 
     + 
     'SORT_IN_TEMPDB = OFF, FILLFACTOR =' 
     + 
     CAST(ix.fill_factor AS VARCHAR(3)) 
    AS IndexOptions 
    ,ix.is_disabled 
    ,FILEGROUP_NAME(ix.data_space_id) FileGroupName 
FROM sys.tables t 
INNER JOIN sys.indexes ix 
    ON t.object_id=ix.object_id 
WHERE ix.type>0 
    AND ix.is_primary_key=0 
    AND ix.is_unique_constraint=0 
    --and schema_name(tb.schema_id)= @SchemaName and [email protected] 
    AND t.is_ms_shipped=0 
    AND t.name<>'sysdiagrams' 
ORDER BY schema_name(t.schema_id) 
    ,t.name 
    ,ix.name 

OPEN CursorIndex 
FETCH NEXT FROM CursorIndex INTO @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions,@is_disabled, @FileGroupName 

WHILE (@@fetch_status=0) 
BEGIN 
DECLARE @IndexColumns varchar(max) 
DECLARE @IncludedColumns varchar(max) 

SET @IndexColumns='' 
SET @IncludedColumns='' 

DECLARE CursorIndexColumn CURSOR FOR 
    SELECT col.name, ixc.is_descending_key, ixc.is_included_column 
    FROM sys.tables tb 
    INNER JOIN sys.indexes ix on tb.object_id=ix.object_id 
    INNER JOIN sys.index_columns ixc on ix.object_id=ixc.object_id and ix.index_id= ixc.index_id 
    INNER JOIN sys.columns col on ixc.object_id =col.object_id and ixc.column_id=col.column_id 
    WHERE ix.type>0 and (ix.is_primary_key=0 or ix.is_unique_constraint=0) 
    AND schema_name(tb.schema_id)[email protected] and [email protected] and [email protected] 
    ORDER BY ixc.index_column_id 

OPEN CursorIndexColumn 
FETCH NEXT FROM CursorIndexColumn INTO @ColumnName, @IsDescendingKey, @IsIncludedColumn 

WHILE (@@fetch_status=0) 
BEGIN 
    IF @IsIncludedColumn=0 
    SET @[email protected] + @ColumnName + CASE WHEN @IsDescendingKey=1 THEN ' DESC, ' ELSE ' ASC, ' END 
    ELSE 
    SET @[email protected] + @ColumnName +', ' 

    FETCH NEXT FROM CursorIndexColumn INTO @ColumnName, @IsDescendingKey, @IsIncludedColumn 
END 

CLOSE CursorIndexColumn 
DEALLOCATE CursorIndexColumn 

SET @IndexColumns = substring(@IndexColumns, 1, len(@IndexColumns)-1) 
SET @IncludedColumns = CASE WHEN len(@IncludedColumns) >0 THEN substring(@IncludedColumns, 1, len(@IncludedColumns)-1) ELSE '' END 
-- print @IndexColumns 
-- print @IncludedColumns 

SET @TSQLScripCreationIndex ='' 
SET @TSQLScripDisableIndex ='' 
SET @TSQLScripCreationIndex='CREATE '+ @is_unique [email protected] + ' INDEX ' +QUOTENAME(@IndexName)+' ON ' + QUOTENAME(@SchemaName) +'.'+ QUOTENAME(@TableName)+ '('[email protected]+') '+ 
    CASE WHEN len(@IncludedColumns)>0 THEN CHAR(13) +'INCLUDE (' + @IncludedColumns+ ')' ELSE '' END + CHAR(13)+'WITH (' + @IndexOptions+ ') ON ' + QUOTENAME(@FileGroupName) + ';' 

IF @is_disabled=1 
    SET @TSQLScripDisableIndex= CHAR(13) +'ALTER INDEX ' +QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@SchemaName) +'.'+ QUOTENAME(@TableName) + ' DISABLE;' + CHAR(13) 

PRINT @TSQLScripCreationIndex 
PRINT @TSQLScripDisableIndex 

INSERT INTO #CreateIndexes (SchemaName, TableName, IndexName, is_unique, IndexTypeDesc, is_disabled, FileGroupName, TSQLScripCreationIndex, TSQLScripDisableIndex) 
SELECT @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @is_disabled, @FileGroupName, @TSQLScripCreationIndex, @TSQLScripDisableIndex 

FETCH NEXT FROM CursorIndex INTO @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions,@is_disabled, @FileGroupName 

END 
CLOSE CursorIndex 
DEALLOCATE CursorIndex 


/*Right, let's look at creating our drop index scripts then*/ 

IF OBJECT_ID('tempdb..#DropIndex') IS NOT NULL DROP TABLE #DropIndex 
GO 

DECLARE @SchemaName VARCHAR(256) 
DECLARE @TableName VARCHAR(256) 
DECLARE @IndexName VARCHAR(256) 
DECLARE @TSQLDropIndex VARCHAR(MAX) 

CREATE TABLE #DropIndex (SchemaName varchar(max), TableName varchar(max),IndexName varchar(max), DropScript varchar(max)) 

DECLARE CursorIndexes CURSOR FOR 
    SELECT 
     schema_name(t.schema_id) 
     ,t.name 
     ,i.name 
    FROM sys.indexes i 
    INNER JOIN sys.tables t 
     ON t.object_id= i.object_id 
    WHERE i.type>0 
     AND t.is_ms_shipped=0 
     AND t.name<>'sysdiagrams' 
     AND (is_primary_key=0 and is_unique_constraint=0) 

OPEN CursorIndexes 
FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName 

WHILE @@fetch_status = 0 
BEGIN 
SET @TSQLDropIndex = 'INSERT INTO #DropIndex (SchemaName, TableName, IndexName, DropScript) VALUES (' + CHAR(39) + @SchemaName + CHAR(39) + ', ' + CHAR(39) + @TableName + CHAR(39) + ', ' + CHAR(39) + @IndexName + CHAR(39) + ', ' + CHAR(39) + 'DROP INDEX ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + '.' +QUOTENAME(@IndexName) + CHAR(39) + ')' 
EXEC (@TSQLDropIndex) 
FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName 
END 

CLOSE CursorIndexes 
DEALLOCATE CursorIndexes 


UPDATE ci 
SET TSQLDropIndex = di.DropScript 
FROM #CreateIndexes ci 
JOIN #DropIndex di 
ON ci.SchemaName = di.SchemaName 
AND ci.TableName = di.TableName 
AND ci.IndexName = di.IndexName 

SELECT 
* FROM #CreateIndexes 

Это должно дать вам представление о том, что вам нужно применить к вашей собственной ситуации.

Смежные вопросы