none
如何查询表的引用信息, RRS feed

  • 问题

  • sql2000;最近业务数据出现问题,有一张表,tb_data;在数据库中广泛被引用,有存储过程,触发器,这张表本不该出现重复数据的,但最近偶尔开始出现,所以要找到所有引用了这张表的地方,于是开始用:sp_depends  'tb_data',但是很遗憾,只返回了2个触发器,3个存储过程,但数据库引用绝对不止这几处。

    在网上找了下,没有找到合适的脚本能实现这个功能。不知道该怎么办?

    2012年6月15日 2:47

答案

  • 可以查询 syscomments, 通过 LIKE 或者 CHARINDEX 去判断你的表中这个定义中有的,然后人工进一步查看定义确认一次

    select distinct
     object_name(id)
    from syscomments
    where charindex(N'tb_data', text)>0

    • 已标记为答案 fangyanqin 2012年6月15日 3:41
    2012年6月15日 2:52

全部回复

  • 可以查询 syscomments, 通过 LIKE 或者 CHARINDEX 去判断你的表中这个定义中有的,然后人工进一步查看定义确认一次

    select distinct
     object_name(id)
    from syscomments
    where charindex(N'tb_data', text)>0

    • 已标记为答案 fangyanqin 2012年6月15日 3:41
    2012年6月15日 2:52
  • syscomments只能找到view & stored procedure,而且还不能看加密的。下面这个CTE可以查到直接引用和间接引用某表的对象。

    WITH ReferencingCollection (referencing_id, referenced_id, referencing_desciption, referencing_level)
    AS
    (
        SELECT sed.referencing_id, sed.referenced_id, o.type_desc AS referencing_desciption, 0 AS referencing_level
        FROM sys.sql_expression_dependencies AS sed
      INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
     WHERE sed.referenced_id <> sed.referencing_id

        UNION ALL

        SELECT sed.referencing_id, rc.referenced_id, o.type_desc, referencing_level + 1
        FROM sys.sql_expression_dependencies AS sed
      INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
      INNER JOIN ReferencingCollection AS rc ON sed.referenced_id = rc.referencing_id
     WHERE sed.referenced_id <> sed.referencing_id
    )
    SELECT DISTINCT QUOTENAME (OBJECT_SCHEMA_NAME (referencing_id)) + '.' + QUOTENAME(OBJECT_NAME(referencing_id)) AS referencing_entity_name, referencing_desciption
    FROM ReferencingCollection
    WHERE referenced_id = OBJECT_ID(N'your_tablename')


    想不想时已是想,不如不想都不想。

    2012年6月15日 3:16
    版主
  • Sorry,这个不适用于sql 2000。

    想不想时已是想,不如不想都不想。

    2012年6月15日 3:17
    版主
  • 如果你的存储过程是拼sql语句的话,用邹建的方法可以找出来。

    间接引用的,你可以对sp_depends  的结果再次执行sp_depends。sql 2000没法用简单的方法做递归。


    想不想时已是想,不如不想都不想。

    2012年6月15日 3:23
    版主
  • 多谢二位指点,通过查syscomments筛选出一个触发器,是他的问题,解决。

    查询该表返回了170多条记录,与sysobjects关联控制type in(过程,触发器) 最好,减少筛选量。


    2012年6月15日 3:41