Как написать сценарий для всех объектов базы данных для всех баз данных на уровне экземпляра - PullRequest
0 голосов
/ 21 декабря 2018

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

DROP TABLE IF EXISTS #temp
        SELECT * into #temp from ( select DB_NAME() AS [database_name], sys.schemas.name + '.' + sys.objects.name as [object_name], 
        type as [schema_name], type_desc as [Object_Description]
        FROM    sys.objects 
        INNER JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id 
        where type in 
        ( 
        'p', 'pc', -- stored procs 
        'v', -- views 
        'tf', 'if', 'ft', -- table-valued functions 
        'fn', 'fs', -- scalar-valued functions 
        'af' -- aggregate functions 
        ) )as [SomeAlias]



--select *from #temp

                        DECLARE @name sysname;
                        DECLARE @sql nvarchar(max) =


         'select databse_name  , schema_name   ,object_name , Object_Description from #temp'

                        DECLARE @theSQL nvarchar(max);

                        DECLARE @results TABLE (
                            [database_name] sysname,
                            [object_name} sysname,
                            [schema_name] sysname,
                            [Object_Description] sysname
                        );

                        DECLARE dbs CURSOR STATIC LOCAL FORWARD_ONLY READ_ONLY 

                        FOR

                        SELECT name 
                        FROM sys.databases;
                        -- you may want to exclude system databases here
                        -- WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb', 'distribution')

                        OPEN dbs;
                        FETCH NEXT FROM dbs INTO @name;

                        WHILE @@FETCH_STATUS = 0
                        BEGIN
                            SET @theSQL = 'EXEC ' + QUOTENAME(@name) + '.sys.sp_executesql @sql';

                            INSERT @results
                            EXEC sys.sp_executesql @theSQL, N'@sql nvarchar(max)', @sql

                            FETCH NEXT FROM dbs INTO @name; 
                        END

                        CLOSE dbs;
                        DEALLOCATE dbs;

                        SELECT *
                        FROM @results;

1 Ответ

0 голосов
/ 21 декабря 2018

Есть несколько способов получить детали объекта, которые вы ищете во всех базах данных.Ниже я включил два решения: одно с использованием метода cursor, которое было предпринято в вопросе, и другое, которое проще, чем хранимая процедура sp_msforeachdb.

Метод курсора:

declare @db_nm varchar(250)
    , @sql varchar(1000)

DECLARE @results TABLE (
                            [database_name] sysname,
                            [object_name] sysname,
                            [schema_name] sysname,
                            [Object_Description] 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') --system db you're probably not looking for info in

open db

fetch next from db into @db_nm;

while @@fetch_status = 0
begin

    set @sql = 
        'select ''' + @db_nm + ''' AS [database_name]
        , s.name + ''.'' + o.name as [object_name]
        , type as [schema_name]
        , type_desc as [Object_Description] 
        FROM [' + @db_nm + '].sys.objects as o
        INNER JOIN [' + @db_nm + '].sys.schemas as s ON o.schema_id = s.schema_id  
        where type in (''p'', ''pc'', -- stored procs  
                        ''v'', -- views  
                        ''tf'', ''if'', ''ft'', -- table-valued functions  
                        ''fn'', ''fs'', -- scalar-valued functions  
                        ''af'' -- aggregate functions  
                        ) 
        '

    insert into @results
    exec (@sql)

    fetch next from db into @db_nm;

end

close db

deallocate db

select *
from @results

sp_msforeachdb Метод:

Этот метод сопровождается предупреждением о том, что процедура не документирована.

declare @sql varchar(1000) = 
    '
    if ''?'' not in (''master'', ''tempdb'', ''model'', ''msdb'') --system db youre probably not looking for info in
    begin

        select ''?'' AS [database_name]
        , s.name + ''.'' + o.name as [object_name]
        , type as [schema_name]
        , type_desc as [Object_Description] 
        FROM [?].sys.objects as o
        INNER JOIN [?].sys.schemas as s ON o.schema_id = s.schema_id  
        where type in (''p'', ''pc'', -- stored procs  
                        ''v'', -- views  
                        ''tf'', ''if'', ''ft'', -- table-valued functions  
                        ''fn'', ''fs'', -- scalar-valued functions  
                        ''af'' -- aggregate functions  
                        ) 

    end
    '

DECLARE @results TABLE (
                            [database_name] sysname,
                            [object_name] sysname,
                            [schema_name] sysname,
                            [Object_Description] sysname
                        );

insert into @results
exec master.dbo.sp_msforeachdb @sql

select *
from @results
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...