【问题标题】:How to Find the list of Stored Procedures which affect a particular column?如何查找影响特定列的存储过程列表?
【发布时间】:2010-10-15 17:37:48
【问题描述】:

我正在研究这个大型数据库,它在 SP 中嵌入了很多业务知识[我知道!],并且 SP 之间有很多链接。即一个存储过程调用另一个。

我想找出更新特定列的存储过程列表。我该怎么做。

按照中所述使用 showplan_All SQL Table and column Parser for stored procedures 对我不起作用,因为这是一个共享的开发数据库。

如所述使用来自主数据库的 Sp 扫描系统文本是不可行的,因为我无权访问主数据库。

那么我怎样才能找到这些信息呢?

【问题讨论】:

标签: sql sql-server sql-server-2005 stored-procedures


【解决方案1】:

你试过这个吗:EXEC sp_depends @objname = [table name of the column you are interested in].

例如,如果您在名为 Product 的表中有一个名为 Price 的列,您将执行以下操作:EXEC sp_depends @objname = N'Product'。

只需执行此操作即可为您提供依赖于该特定表的所有 sps、视图等的列表。

我一直在使用它,因为我使用的数据库有 400 多个表 :-)

sp_depends page on MSDN

【讨论】:

    【解决方案2】:
    use msdb
    go
    select * from sysjobs j
    inner join sysjobsteps s
    on j.job_id=s.job_id
    where command like '%HBR_INSTRUMENT%'
    

    【讨论】:

      【解决方案3】:

      从系统视图sys.sql_dependencies你可以得到列级别的依赖。

      DECLARE @Schema SYSNAME
      DECLARE @Table SYSNAME
      DECLARE @Column SYSNAME
      
      SET @Schema = 'dbo'
      SET @Table = 'TableName'
      SET @Column = 'ColumnName'
      
      SELECT o.name
      FROM sys.sql_dependencies AS d
        INNER JOIN sys.all_objects AS o ON o.object_id = d.object_id
        INNER JOIN sys.all_objects AS ro ON ro.object_id = d.referenced_major_id
        INNER JOIN sys.all_columns AS c ON c.object_id = ro.object_id AND c.column_id = d.referenced_minor_id
      WHERE (SCHEMA_NAME(ro.schema_id)=@Schema) 
        and o.type_desc = 'SQL_STORED_PROCEDURE'
        and ro.name = @Table
        and c.name = @Column
      GROUP BY o.name
      

      【讨论】:

      • 这给出了包括 * 在内的准确结果。谢谢。!!
      • 我已经在 Northwind 数据库中使用 SET @Schema = 'dbo'; SET @Table = 'Orders'; SET @Column = 'OrderID' 进行了尝试,但它没有返回任何结果。
      【解决方案4】:

      这是在 SQL 2000+ 中工作的一个;请注意,正如 Andrew 在他的文章中所指出的那样,根据您的列名,您会得到误报,但这是一个起点:

      SELECT DISTINCT o.Name
      FROM syscomments c
          JOIN sysobjects o ON c.ID = o.ID
      WHERE c.Text LIKE '%ColumnName%'
      ORDER BY o.Name
      

      【讨论】:

        【解决方案5】:

        试试这样的:

        use YourDatabase;
        
        select [Name]    
        from sys.procedures
        where object_definition([object_id]) like '%YourColumnName%';
        

        显然,根据列的名称,这可能会产生大量误报,但至少您将有一个要筛选的过程列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多