【问题标题】:Get all the stored procedures from all databases in SQL Server 2008从 SQL Server 2008 中的所有数据库中获取所有存储过程
【发布时间】:2013-03-30 23:57:46
【问题描述】:

任何人都可以就在所有数据库中检索所有存储过程的列表及其模式名称的方法提出建议吗?感谢您的意见!

【问题讨论】:

    标签: sql-server-2008 stored-procedures


    【解决方案1】:

    对于单个数据库:

    select s.name + '.' + p.name as sproc_name_with_schema
      from sys.procedures as p inner join
        sys.schemas as s on s.schema_id = p.schema_id
    

    所有数据库都需要它吗?你的问题有点不清楚。

    declare @Sprocs as Table ( DBName VarChar(64), SprocName VarChar(128) )
    insert into @Sprocs
      execute sp_MSforeachdb N'use ?; select ''?'', s.name + ''.'' + o.name from sys.all_objects as o inner join sys.schemas as s on s.schema_id = o.schema_id where o.type = ''P'''
    select * from @Sprocs
    

    【讨论】:

    【解决方案2】:
    CREATE TABLE #x(db SYSNAME, s SYSNAME, p SYSNAME);
    
    DECLARE @sql NVARCHAR(MAX) = N'';
    
    SELECT @sql += N'INSERT #x SELECT ''' + name + ''',s.name, p.name
      FROM ' + QUOTENAME(name) + '.sys.schemas AS s
      INNER JOIN ' + QUOTENAME(name) + '.sys.procedures AS p
      ON p.schema_id = s.schema_id;
    ' FROM sys.databases WHERE database_id > 4
    
    EXEC sp_executesql @sql;
    
    SELECT db,s,p FROM #x ORDER BY db,s,p;
    
    DROP TABLE #x;
    

    【讨论】:

      【解决方案3】:

      对于所有数据库,搜索用户定义的存储过程、视图、函数和表值函数,以下可能会有所帮助(基于上述 Habo):

      declare @Sprocs as Table (DBName VarChar(64), SchemaName varchar (128), 
          StoredProcName VarChar(128), 
          type varchar(10), type_desc varchar(128), 
          create_date datetime, modify_date datetime, is_MS_Shipped int)
      insert into @Sprocs
          execute sp_MSforeachdb N'use ?; select ''?'', 
              s.name as SchemaName, o.name as StoredProcName, 
              type, type_desc, create_date, modify_date, is_MS_Shipped
              from sys.all_objects as o inner join sys.schemas as s 
                  on s.schema_id = o.schema_id 
              where o.type in (''P'', ''V'', ''PC'', ''FN'', ''TF'')
                  and is_ms_shipped = 0'
      
      select * from @Sprocs
      where DBName not in ('master', 'tempdb', 'model', 'msdb', 'dba') 
      order by DBName, SchemaName, type, StoredProcName
      

      添加“U”以获取用户生成的表格。

      【讨论】:

      • 如果需要列出 CLR_SCALAR_FUNCTIONs,请考虑添加类型过滤器“FS”,如果需要 SQL_INLINE_TABLE_VALUED_FUNCTIONs,请考虑添加“IF”
      【解决方案4】:

      没有临时表和插入的第一个答案的替代方案:

      declare @sql varchar(max) = '';
      select 
          @sql += ' ' +
          'union all ' +
          'select ''' +
              dat.name + ''' as bas, b.name as sch, a.name as pro ' +
          'from ' +
              '[' + dat.name + '].[sys].procedures as a ' +
              'inner join [' + dat.name + '].[sys].schemas as b on a.schema_id = b.schema_id'
      from sys.databases as dat;
      set @sql = RIGHT(@sql, LEN(@sql) - 11);
      exec(@sql);
      print @sql;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多