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


136

テスト目的で開発環境のテーブルを作成しましたが、このテーブルを参照しているspはほとんどありません。次に、このテーブルを削除し、このテーブルを参照しているすべてのspを特定する必要があります。すべてのspのリストを見つけるのが困難です。テーブル名が「x」で、データベースがSQL Server 2005であると想定して、クエリをいくつか提案してください。




1
専門家へ:非MS SQLサーバーはどうですか?
Deian

回答:


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

ところで、これはこのタイプの質問のための便利なリソースです:SQL ServerシステムカタログFAQのクエリ


3
ROUTINE_DEFINITIONonにアクセスするよりも、これを行う理由はありますINFORMATION_SCHEMA.ROUTINESか?
2016年

1
@Marie-SQL-Server 2005(AFAIK)にはありません。
2016

2
質問、このソリューションは、文字列で参照さている参照オブジェクトを見つけますか?のようなset @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark

1
@ Jeff.Clark-見つける簡単な方法があります:-)-しかし、はい、それはプロシージャのテキストを直接検索するので、それを見つけます。
2016


27

以下は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

1
OPはSQL-Server-2005
Chains

19

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

EXEC sp_depends @objname = N'TableName';

1
私にとって、これはトリガーとビューを示しましたが、ストアドプロシージャは示していませんでした。
NealWalters

1
注:これは、テーブルにアクセスできたがストアドプロシージャにはアクセスできなかったシステムで実行したため、当然、ストアドプロシージャは結果に表示されませんでした。
NealWalters 2018

18

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

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

編集

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


4
2005では、オブジェクトが正しい順序で作成されていない場合、依存関係情報は信頼できません。
マーティンスミス

3
@Martin Smithが述べたように、存在しないオブジェクトを参照するストアドプロシージャが作成されますが、警告は出ますが、sysdependsにはエントリが配置されません。また、外部データベースのテーブルを参照するストアドプロシージャについても同じことが言えます。どちらのデータベースのsysdependsにもエントリはありません。もう1つの機能は、テーブルまたはビューを削除または再作成すると、依存関係チェーンが壊れることです。これらの...エラー...機能により、SQL Serverの依存関係の追跡はほとんど役に立ちません。
ニコラスキャリー

7

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

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

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


2
syscommentsこの方法でのクエリは、定義を複数の行にまたがって4000文字のチャンクに分割するため、長い手順では信頼性がありません。sys.sql_modulesこれを避けます。
マーティン・スミス

1
いい視点ね。sys.sql_modules代わりに使用できるように更新しました。
トムH

3
syscommentsのは、私のダースの一つ一つに、同じ質問への回答よう暴かれていstackoverflow.com/...
GBN

5

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

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

1
私にとって、SQL Server 12.0のデータベースに対して実行されているSSMS 2014で何も返されませんでした)
NealWalters

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

GO

これは、テーブル名を指定する必要がある場合に機能します。


3

Management Studioでは、右クリックしてテーブルをクリックし、[依存関係の表示]をクリックします ここに画像の説明を入力してください

テーブルと依存関係のあるオブジェクトのリストを見ることができます:ここに画像の説明を入力してください


1

基本的に2つのオプションがあります。

- - オプション1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----オプション2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

これらの2つのクエリは、必要なテーブルを参照しているすべてのストアドプロシージャを取得します。このクエリは、sysobjectsとsyscommentsである2つのsysテーブルに依存しています。sysobjectsは、すべてのDBオブジェクト名が格納される場所です。これには、ストアドプロシージャが含まれます。

syscommentsには、すべての手順のテキストが含まれています。

クエリする場合: SELECT * FROM syscomments

sysobjectsテーブルへのマッピングであるIDを含むテーブルがあり、テキストは最後の列としてストアドプロシージャに含まれています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.