【问题标题】:How can I retrieve all the stored procedures and their input and output parameters in all the databases from SQL Server?如何从 SQL Server 检索所有数据库中的所有存储过程及其输入和输出参数?
【发布时间】:2016-06-10 19:37:43
【问题描述】:

抱歉,对于一个令人费解的问题 - 我不是 dba。是否有一个简单的脚本可以运行,它可以列出我在 SQL Server 上的所有存储过程,按数据库分组,并使用存储过程附带的输入和输出参数列出它们。

我在 SQL 之外编写了一个类似的脚本,以对调用存储过程的语言执行相同的操作,因此我会发现遗留应用程序中是否存在冲突。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用以下脚本:

    DECLARE @CurrentRowID INT
           ,@CurrentDatabase SYSNAME;
    
    DECLARE @DynamicSQL NVARCHAR(MAX);
    
    IF OBJECT_ID('tempdb..##DataSource') IS NOT NULL
    BEGIN
        DROP TABLE ##DataSource;
    END;
    
    CREATE TABLE ##DataSource 
    (
        [database] SYSNAME
       ,[procedure] SYSNAME
       ,[parameter] SYSNAME
       ,[is_output] BIT
    );
    
    DECLARE @DataBases TABLE
    (
        [RowID] INT IDENTITY(1,1)
       ,[database] SYSNAME
    );
    
    INSERT INTO @DataBases ([database])
    SELECT [name]
    FROM [sys].[databases];
    
    WHILE EXISTS(SELECT 1 FROM @DataBases)
    BEGIN
    
        SELECT TOP 1 @CurrentRowID = [RowID]
                    ,@CurrentDatabase = [database]
        FROM @DataBases;
    
        SET @DynamicSQL = N'INSERT INTO ##DataSource
                             SELECT ''' + @CurrentDatabase + ''' AS [database]
                                  ,PR.[name]
                                  ,P.[name]
                                  ,P.[is_output]
                            FROM [' + @CurrentDatabase + '].[sys].[procedures] PR
                            INNER JOIN [' + @CurrentDatabase + '].[sys].[parameters] P
                                ON PR.[object_id] = P.[object_id]'
    
        EXEC sp_executesql @DynamicSQL;
    
    
        DELETE FROM @DataBases
        WHERE [RowID] = @CurrentRowID;
    END;
    
    SELECT *
    FROM ##DataSource
    

    当然,您可以过滤一些数据库,或者从sys.procedures dmv 中添加更多列,例如系统类型。

    【讨论】:

      【解决方案2】:

      在 sys.databases 和循环内运行循环/游标,使用并运行以下查询并继续联合:

      SELECT pr.name [Procedure], par.name Parameter, CASE WHEN is_output = 1 THEN 'Output Parameter' ELSE 'Input Parameter' END [ParameterType]
      FROM sys.parameters par
      INNER JOIN sys.procedures pr ON pr.object_id = par.object_id
      ORDER BY [Procedure], [ParameterType]
      

      这将为您提供所有过程及其相关参数。

      【讨论】:

        【解决方案3】:

        声明@sql nvarchar(max) = ''

        设置@sql = @sql + N'union all select '''+ quotename(d.name) + N''' as db, s.name as sname, p.name as p.name, r.名称为参数名,r.is_output 为参数输出 从 '''+ 引用名(d.name)+ N'''.sys.procedures p 在 p.object_id = r.object_id 上加入 sys.parameters r 在 p.schema_id = s.schema_id' 上加入 sys.schemas 从 sys.databases d -- d.name like .... 按 d.name 排序

        设置@sql = stuff@sql, 1, 10, N'') exec sp_executesql @sql

        -- 未测试

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 2018-08-14
          相关资源
          最近更新 更多