web-dev-qa-db-ja.com

SQL Server 2008を使用して、テーブル名検索に基づいてストアドプロシージャの名前を見つける方法

特定のテーブルが使用されているすべてのストアドプロシージャを検索したい。データベースには多くのストアドプロシージャがあるため、各プロシージャをチェックすることはできません。

ストアドプロシージャを見つけるために検索クエリを使用する方法はありますか?

私はこのコードを試しました:

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

RejectionReasonは私のテーブル名ですが、RejectionReasonが列名として使用されているすべてのプロシージャを示しているため、機能しません。

18
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 /

21

RedGateの無料ツール SQL Search を使用してみてください。

4
Alex_L

これが機能することを願うコードを以下に示します。コードに応じてテーブル名を変更するだけです

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%'

ストアプロシージャとテーブルリレーションのリストを取得します。

3
Praveen04

[〜#〜] 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');
1
VS1

私が知っている2つの可能性があります。

まず、SQL Management Studioには依存関係を表示するオプションがあります。テーブルを右クリックしてView Dependenciesを選択しますが、これにより、テーブル名が動的SQLに埋め込まれているuspsが強調表示されません。

2番目のオプションは、データベースを右クリックしてGenerate Scriptsを選択することです。ウィザードに従って、すべてのuspsをスクリプト化して新しいクエリウィンドウに移動し、テーブルの名前を検索します。これは面倒ですが、すべての用途が見つかります。

0
BonyT

列名の検索およびデータベースのすべてのストアドプロシージャ内のテキストに次のSQLスクリプトを使用しています。ストアドプロシージャ内のテーブルを見つけるためにも使用できます。

変数に検索用語を指定します@SearchForLIKE式で使用する場合、たとえば'%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
0
Matt

これにより、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%'
0

このスクリプトは、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/

0
Sumit

SysObjectsは、データベース内のすべてのオブジェクトに関する基本情報を保存します。各オブジェクトの名前とオブジェクトのタイプを教えてくれるので、知っておくと便利です。

SysCommentsは、ストアドプロシージャと関数の実際のテキスト(コード)を格納します。これには、SysObjectsのidフィールドにマップし直すIDフィールドが含まれています。

select so.name, text
from sysobjects so, syscomments sc
where so.id = sc.id
and text like '%RejectionReason%'
0