Как вывести список всех индексов и связанных с ними объектов во всех базах данных (SQL Server) с помощью курсора - PullRequest
0 голосов
/ 05 января 2019

Я хотел перечислить все объекты, связанные с индексами и индексами, во всех моих базах данных (в моем случае 48) и решил использовать курсор. Я обнаружил код переполнения стека, который делает то же самое для заданной базы данных, но изменен для использования курсора, поэтому я могу иметь одинаковую информацию для всех баз данных. Проблема в том, что код выглядит нормально, но когда я его запускаю, он дает мне Ошибка. Как я могу исправить этот код и заставить его работать? Спасибо

-- SQL query to collect  all indexes and related objects 
-- instance level from multiple databases 
DECLARE @db_nm VARCHAR(250), @sql NVARCHAR(1000)

DECLARE @results TABLE
                 (
                      [database_name] sysname,
                      [table_view] sysname,
                      [object_type] sysname,
                      [constraint_type] sysname, 
                      [constraint_name] sysname,
                      [columns] sysname,
                      [index_name] sysname,
                      [index_type] sysname
                 );

DECLARE db CURSOR LOCAL FAST_FORWARD FOR
    SELECT db.name
    FROM master.sys.databases AS db
    WHERE db.name NOT IN ('master', 'tempdb', 'model', 'msdb') 
      AND db.state_desc = 'ONLINE' --system db you're probably not looking for info in

OPEN db ;

FETCH NEXT FROM db INTO @db_nm;

WHILE @@fetch_status = 0
BEGIN
    -- select * from sys.objects t
    -- select schema_name(t.schema_id) + '.' + t.[name] as table_view from ---sys.objects t

    SET @sql= 'select  ''' + @db_nm + ''' AS [database_name], schema_name(t.schema_id) + t.[name] as [table_view],
      case when t.[type] = 'U' Then 'Table'
       case when t.[type] = 'V' then 'View'
        end as [object_type],
    case when c.[type] = 'PK' then 'Primary key'
        when c.[type] = 'UQ' then 'Unique constraint'
        when i.[type] = 1 then 'Unique clustered index'
        when i.type = 2 then 'Unique index'
        end as [constraint_type], 
    c.[name] as [constraint_name],
    substring(column_names, 1, len(column_names)-1) as [columns],
    i.[name] as [index_name],
    case when i.[type] = 1 then 'Clustered index'
        when i.type = 2 then 'Index'
        end as [index_type]
from [' + @db_nm + '].sys.objects t
    left outer join [' + @db_nm + '].sys.indexes i
        on t.object_id = i.object_id
    left outer join [' + @db_nm + '].sys.key_constraints c
        on i.object_id = c.parent_object_id 
        and i.index_id = c.unique_index_id
   cross apply (select col.[name] + ', '
                    from [' + @db_nm + '].sys.index_columns ic
                        inner join [' + @db_nm + '].sys.columns col
                            on ic.object_id = col.object_id
                            and ic.column_id = col.column_id
                    where ic.object_id = t.object_id
                        and ic.index_id = i.index_id
                            order by col.column_id
                            for xml path ('') ) D (column_names)
where is_unique = 1
and t.is_ms_shipped <> 1
order by schema_name(t.schema_id) + '.' + t.[name]';

    INSERT INTO @results
        EXEC (@sql)

    FETCH NEXT FROM db INTO @db_nm;
END;

CLOSE db;
DEALLOCATE db;

-- select * into #temp from @results
SELECT * FROM @results;

--Here is the code that fits my need   for one given database but want to loop it for all databases 
SELECT
    schema_name(t.schema_id) + '.' + t.[name] as table_view, 
    CASE WHEN t.[type] = 'U' THEN 'Table'
         WHEN t.[type] = 'V' THEN 'View'
    END AS [object_type],
    CASE WHEN c.[type] = 'PK' THEN 'Primary key'
         WHEN c.[type] = 'UQ' THEN 'Unique constraint'
         WHEN i.[type] = 1 THEN 'Unique clustered index'
         WHEN i.type = 2 THEN 'Unique index'
    END AS constraint_type, 
    c.[name] AS constraint_name,
    substring(column_names, 1, len(column_names)-1) as [columns],
    i.[name] as index_name,
    case when i.[type] = 1 then 'Clustered index'
         when i.type = 2 then 'Index'
                                end as index_type
from sys.objects t
    left outer join sys.indexes i
        on t.object_id = i.object_id
    left outer join sys.key_constraints c
        on i.object_id = c.parent_object_id 
        and i.index_id = c.unique_index_id
   cross apply (select col.[name] + ', '
                    from sys.index_columns ic
                        inner join sys.columns col
                            on ic.object_id = col.object_id
                            and ic.column_id = col.column_id
                    where ic.object_id = t.object_id
                        and ic.index_id = i.index_id
                            order by col.column_id
                            for xml path ('') ) D (column_names)
where is_unique = 1
and t.is_ms_shipped <> 1
order by schema_name(t.schema_id) + '.' + t.[name]
...