web-dev-qa-db-ja.com

特定のテーブルを参照しているすべてのストアドプロシージャを識別する方法

テスト目的で開発環境に関するテーブルを作成しましたが、このテーブルを更新しているspはほとんどありません。今度はこの表を参照しているすべてのspを識別するだけでなく、この表を削除する必要があります。私はすべてのspのリストを見つけるのが困難に直面しています。テーブル名を 'x'、データベースをSQL Server 2005と仮定して、いくつかのクエリを提案してください。

107
DJay
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

ところで - これは、この種の質問に役立つリソースです。SQL Serverシステムカタログの照会FAQ

200
Chains

以下はSQL2008以降で動作します。ストアドプロシージャと関数の両方の一覧を提供します。

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name
24
Guy Hollington

クエリ以外の方法は、Sql Server Management Studioを使用することです。

テーブルを見つけて右クリックし、[依存関係の表示]を選択します。

EDIT

しかし、コメンターが言ったように、それはあまり信頼できません。

15
Hans Kesting

上記のクエリでは正しい結果が得られない場合があります。テーブルの依存関係を取得するために使用可能な組み込みストアドプロシージャがあります。

EXEC sp_depends @objname = N'TableName';
14
Pramod Pawar

次のクエリは、すべてのストアドプロシージャ名とそれらのSPの対応する定義を取得します。

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'
6
Deepak Kothari
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

テーブル名がコメント内にある場合、またはテーブル名が使用されている別のテーブル名のサブストリングである場合も、SPが表示されることに注意してください。たとえば、「test」と「test_2」という名前のテーブルがあり、「test」でSPを検索しようとすると、両方の結果が得られます。

5
Tom H

以下のクエリは、テーブル上の依存関係を検索するときにのみ機能し、列上の依存関係を検索するときには機能しません。

EXEC sp_depends @objname = N'TableName';

ただし、次のクエリはあらゆる種類の依存関係を検索する場合に最適なオプションです。これを見逃すことはありません。実際には必要以上に多くの情報が得られます。

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name
5
Siraj Ansari

Management Studioでは、テーブルを右クリックして[View Dependencies]をクリックするだけです enter image description here

あなたのテーブルと依存関係を持つオブジェクトのリストを見ることができるよりも: enter image description here

2
nzrytmn
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

あなたがテーブル名を言及しなければならないならば、これはうまくいくでしょう。

2
ric

これを試して

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
0
Pooja Chavan