テスト目的で開発環境のテーブルを作成しましたが、このテーブルを参照しているspはほとんどありません。次に、このテーブルを削除し、このテーブルを参照しているすべてのspを特定する必要があります。すべてのspのリストを見つけるのが困難です。テーブル名が「x」で、データベースがSQL Server 2005であると想定して、クエリをいくつか提案してください。
テスト目的で開発環境のテーブルを作成しましたが、このテーブルを参照しているspはほとんどありません。次に、このテーブルを削除し、このテーブルを参照しているすべてのspを特定する必要があります。すべてのspのリストを見つけるのが困難です。テーブル名が「x」で、データベースがSQL Server 2005であると想定して、クエリをいくつか提案してください。
回答:
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
ところで、これはこのタイプの質問のための便利なリソースです:SQL ServerシステムカタログFAQのクエリ
ROUTINE_DEFINITION
onにアクセスするよりも、これを行う理由はありますINFORMATION_SCHEMA.ROUTINES
か?
set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
以下は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
上記のクエリでは正しい結果が得られない場合があります。次のように、テーブルの依存関係を取得できるストアドプロシージャが組み込まれています。
EXEC sp_depends @objname = N'TableName';
クエリ以外の方法は、SQL Server Management Studioを使用することです。
テーブルを見つけて右クリックし、「依存関係を表示」を選択します。
編集
しかし、コメンターが言ったように、それはあまり信頼できません。
次のクエリは、すべてのストアドプロシージャ名とそれらのSPの対応する定義をフェッチします
select
so.name,
text
from
sysobjects so,
syscomments sc
where
so.id = sc.id
and UPPER(text) like '%<TABLE NAME>%'
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を検索しようとすると、両方の結果が得られます。
syscomments
この方法でのクエリは、定義を複数の行にまたがって4000文字のチャンクに分割するため、長い手順では信頼性がありません。sys.sql_modules
これを避けます。
sys.sql_modules
代わりに使用できるように更新しました。
以下のクエリは、テーブルの依存関係を検索する場合にのみ機能し、列の依存関係は検索しません。
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
基本的に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を含むテーブルがあり、テキストは最後の列としてストアドプロシージャに含まれています。