特定のテーブルが使用されているすべてのストアドプロシージャを検索したい。データベースには多くのストアドプロシージャがあるため、各プロシージャをチェックすることはできません。
ストアドプロシージャを見つけるために検索クエリを使用する方法はありますか?
私はこのコードを試しました:
SELECT distinct so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '% RejectionReason %'
RejectionReason
は私のテーブル名ですが、RejectionReason
が列名として使用されているすべてのプロシージャを示しているため、機能しません。
SELECT o.name, o.type_desc, p.name, p.type_desc
FROM sys.sql_dependencies d
INNER JOIN sys.objects o
ON d.object_id = o.object_id
INNER JOIN sys.objects p
ON d.referenced_major_id = p.object_id
AND o.name = 'RejectionReason'
または
SELECT o.name, t.TABLE_NAME, c.text
FROM syscomments c
JOIN sysobjects o
ON c.id = o.id
JOIN INFORMATION_SCHEMA.Tables t
ON c.text LIKE '%RejectionReason%'
または
EXEC sp_depends @objname = N'RejectionReason';
これらのいずれもこのブログの確認に役立たない場合: http://blog.sqlauthority.com/2010/02/04/sql-server-get-the-list-of-object-dependencies-sp_depends-and- information_schema-routines-and-sys-dm_sql_referencing_entities /
RedGateの無料ツール SQL Search を使用してみてください。
これが機能することを願うコードを以下に示します。コードに応じてテーブル名を変更するだけです
SELECT DISTINCT so.name
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id
WHERE sc.text LIKE '%tablename%'
例えば。:
SELECT DISTINCT so.name
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id
WHERE sc.text LIKE '%users%'
ストアプロシージャとテーブルリレーションのリストを取得します。
[〜#〜] msdn [〜#〜]sp_depends
は、今後使用する場合に備えて将来のリリースで削除されますが、代わりに次の query を使用できます。
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbo.TableName', 'OBJECT');
私が知っている2つの可能性があります。
まず、SQL Management Studioには依存関係を表示するオプションがあります。テーブルを右クリックしてView Dependencies
を選択しますが、これにより、テーブル名が動的SQLに埋め込まれているuspsが強調表示されません。
2番目のオプションは、データベースを右クリックしてGenerate Scripts
を選択することです。ウィザードに従って、すべてのuspsをスクリプト化して新しいクエリウィンドウに移動し、テーブルの名前を検索します。これは面倒ですが、すべての用途が見つかります。
列名の検索およびデータベースのすべてのストアドプロシージャ内のテキストに次のSQLスクリプトを使用しています。ストアドプロシージャ内のテーブルを見つけるためにも使用できます。
変数に検索用語を指定します@SearchFor
(LIKE
式で使用する場合、たとえば'%LastName%'
で列を検索しますおよびLastName
)を含むストアドプロシージャ。
テーブル内の列名と、ストアドプロシージャ内のテキストを検索します。 @SPNameOnly
に0を設定すると、スクリプトはSPソースコードを表示することもできます。
--
-- Purpose: Search field names in all tables, views stored procedures
--
DECLARE @SearchFor nvarchar(max)='%Search_SP_Or_Table_Or_View%' -- search for this string
DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code
-- tables
if (@SearchSP=1) begin
(
select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object],
t.table_type
from information_schema.columns c
left join information_schema.Tables t on c.table_name=t.table_name
where column_name like @SearchFor or t.table_name like @SearchFor
UNION
select '['+routine_Schema+'].['+routine_Name+']' [schema_object],
'PROCEDURE' as table_type from information_schema.routines
where routine_definition like @SearchFor or routine_name like @SearchFor
and routine_type='procedure'
)
order by table_type, schema_object
end else begin
select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object],
t.table_type
from information_schema.columns c
left join information_schema.Tables t on c.table_name=t.table_name
where column_name like @SearchFor or t.table_name like @SearchFor
order by c.table_Name, c.column_name
end
-- stored procedure (source listing)
if (@SearchSP=1) begin
if (@DisplaySPSource=1) begin
select '['+routine_Schema+'].['+routine_Name+']' [schema.sp], routine_definition
from information_schema.routines
where routine_definition like @SearchFor or routine_name like @SearchFor
and routine_type='procedure'
order by routine_name
end
end
これにより、SPとビューが返されます。
SELECT DISTINCT o.name AS Object_Name,o.type_desc
FROM sys.sql_modules m
INNER JOIN sys.objects o
ON m.object_id=o.object_id
WHERE m.definition Like '%TableName%'
このスクリプトは、SPを含むテーブルのすべての依存オブジェクトを表示すると思います。
USE MYDatabase
GO
DECLARE @TableName varchar(100)
SET @TableName = 'mytable'
SELECT
SourceSchema = OBJECT_SCHEMA_NAME(sed.referencing_id)
,SourceObject = OBJECT_NAME(sed.referencing_id)
,ReferencedDB = ISNULL(sre.referenced_database_name, DB_NAME())
,ReferencedSchema = ISNULL(sre.referenced_schema_name,
OBJECT_SCHEMA_NAME(sed.referencing_id))
,ReferencedObject = sre.referenced_entity_name
,ReferencedColumnID = sre.referenced_minor_id
,ReferencedColumn = sre.referenced_minor_name
FROM sys.sql_expression_dependencies sed
CROSS APPLY sys.dm_sql_referenced_entities(OBJECT_SCHEMA_NAME(sed.referencing_id)
+ '.' + OBJECT_NAME(sed.referencing_id), 'OBJECT') sre
WHERE sed.referenced_entity_name = @TableName
AND sre.referenced_entity_name = @TableName
詳細については、チェックアウトできます。 http://sqlserverplanet.com/sql-server-2008/find-dependent-objects/
SysObjectsは、データベース内のすべてのオブジェクトに関する基本情報を保存します。各オブジェクトの名前とオブジェクトのタイプを教えてくれるので、知っておくと便利です。
SysCommentsは、ストアドプロシージャと関数の実際のテキスト(コード)を格納します。これには、SysObjectsのidフィールドにマップし直すIDフィールドが含まれています。
select so.name, text
from sysobjects so, syscomments sc
where so.id = sc.id
and text like '%RejectionReason%'