web-dev-qa-db-ja.com

SQL Serverデータベース内のオブジェクトへのすべての参照を検索する

SQL Serverデータベース内のオブジェクトへのすべての参照を検索しようとしています。

どうすればすばやく検索できますか? SQL Server Management Studioはそれをしていないようです。私は http://www.red-gate.com/products/SQL_Search/ を使用していますが、これに対する "公式"のMicrosoftソリューションを見つけたいです。別の製品にありますか?

たとえば、ビジュアルスタジオで一括検索を行う場合、すべてのストアドプロシージャで何かを検索できるようにしたいと考えています。

それとも私はこれを正しい方法でコーディングしていませんか?

カール

21
Malartre

使用する:

select object_name(m.object_id), m.*
  from sys.sql_modules m
 where m.definition like N'%name_of_object%'

...SYSCOMMENTSINFORMATION_SCHEMA.routines nvarchar(4000)列があります。したがって、「name_of_object」が位置3998で使用されている場合、それは見つかりません。 SYSCOMMENTSには複数の行がありますが、INFORMATION_SCHEMA.routinesは切り捨てます。

40
OMG Ponies

SQL 2008では、DMV(データ管理関数)sys.dm_sql_referencing_entitiesが追加されました。渡したオブジェクトを参照するオブジェクトを返します。

SELECT * FROM sys.dm_sql_referencing_entities('dbo.Table1', 'OBJECT')
3

パーティーに遅れるが...

システムプロシージャsys.sp_dependsを使用できます。

exec sys.sp_depends 'object_name'

結果は、object_nameに依存する(つまり、参照する)すべてのデータベースオブジェクトをリストしたテーブルです。各行には、object_nameのタイプに応じて、参照オブジェクトの名前とタイプ、および他の情報列が含まれます。


注:このプロシージャはMS SQL Server 2008で追加されました。

参照: MSDN docs

ドキュメントでは、このプロシージャは将来のリリースで削除される可能性があり、代わりにsys.dm_sql_referencing_entitiesを使用するように言われていますが、まだMS SQL 2017で生きていてキックしています。

2
David R Tribble

ドキュメントに記載されていないSQL spを使用した場合:sp_msforeachdb

exec sp_msforeachdb '
USE [?];

--IF DB_NAME() NOT IN (''master'',''tempdb'',''model'',''msdb'')
BEGIN
DECLARE 
    @SearchStr varchar(100) 
    SET @SearchStr = ''%column_store_segments%''; 
SELECT DISTINCT
    ''?'' as db_name, o.name
    , ( CASE upper(o.xtype) 
            WHEN ''C'' THEN ''CHECK constraint''        
            WHEN ''D'' THEN ''Default or DEFAULT constraint''                       
            WHEN ''F'' THEN ''FOREIGN KEY constraint''  
            WHEN ''L'' THEN ''Log''                                                                 
            WHEN ''FN'' THEN ''Scalar function''        
            WHEN ''IF'' THEN ''Inline table-function''
            WHEN ''PK'' THEN ''PRIMARY KEY or UNIQUE constraint''
            WHEN ''P'' THEN ''Stored procedure''                                            
            WHEN ''R'' THEN ''Rule''                    
            WHEN ''RF'' THEN ''Replication filter stored procedure''            
            WHEN ''S'' THEN ''System table''            
            WHEN ''TF'' THEN ''Table function''
            WHEN ''TR'' THEN ''Trigger''                
            WHEN ''U'' THEN ''User table''      
            WHEN ''V'' THEN ''View''                    
            WHEN ''UQ'' THEN ''UNIQUE constraint (type is K)''                  
            WHEN ''X'' THEN ''Extended stored procedure''                           
        ELSE upper(o.xtype) END ) Type
    , ( CASE upper(o.xtype)
            WHEN ''PK'' THEN ( select object_name(parent_object_id) FROM sys.key_constraints (nolock) WHERE o.name=name )
            WHEN ''F'' THEN ( select object_name(parent_object_id) FROM sys.foreign_keys (nolock) WHERE o.name=name )
            WHEN ''TR'' THEN ( select object_name(parent_id) FROM sys.triggers (nolock) WHERE o.name=name )     
        ELSE '''' END ) as Parent_Object
FROM sysobjects o (nolock) 
INNER JOIN syscomments sc (nolock) ON o.id = sc.id
WHERE UPPER( text ) LIKE UPPER( @SearchStr ) AND substring(o.name,1,3)<> ''dt_'' 
GROUP BY o.name, o.xtype
END'
GO
2
Vonpato

SQL Server Management Studioには、オブジェクトエクスプローラーでオブジェクトを右クリックすると、依存関係の表示機能があります。これはあなたが探しているものですか?

2
David Atkinson

このクエリを使用して、ストアドプロシージャ内のすべてのテーブル(またはテキスト)を検索します。

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

SMGでキーボードショートカットとしてOMGポニーSQLを使用する場合は、次のSPをマスターデータベースに追加します。

USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[SP_FindAllReferences]
@targetText nvarchar(128)
AS
BEGIN
    SET NOCOUNT ON;

    declare @origdb nvarchar(128)
    select @origdb = db_name()

    declare @sql nvarchar(1000)

    set @sql = 'USE [' + @origdb +'];' 
    set @sql += 'select object_name(m.object_id), m.* '
    set @sql += 'from sys.sql_modules m  where m.definition like N' + CHAR(39) + '%' + @targetText + '%' + CHAR(39)

    exec (@sql)

    SET NOCOUNT OFF;
END

次に、dbo.SP_FindAllReferencesをキーボードショートカットに追加するだけで、サーバー上の任意のDBのコンテキストで使用できます。

乾杯!

注意:SQL Server 2005を使用している場合は、置き換える必要があります。

@sql +=

@sql = @sql +
1
DeanOC

私はこのような解決策を見つけました。

USE [Database]
GO

SELECT
referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID),
referencing_object_name = o.name,
referencing_object_type_desc = o.type_desc,
referenced_schema_name,
referenced_object_name = referenced_entity_name,
referenced_object_type_desc = o1.type_desc,
referenced_server_name, referenced_database_name
--,sed.* -- Uncomment for all the columns
FROM
sys.sql_expression_dependencies sed
INNER JOIN
sys.objects o ON sed.referencing_id = o.[object_id]
LEFT OUTER JOIN
sys.objects o1 ON sed.referenced_id = o1.[object_id]
WHERE
referenced_entity_name = 'SP_Pay_GetData'
order by referencing_object_name

http://blog.sqlauthority.com/2012/12/02/sql-server-find-referenced-or-referencing-object-in-sql-server-using-sys-sql_expression_dependencies/

1

「公式のマイクロソフト」のやり方はよくわかりませんが、以前は SqlDigger を使用しました。悪くない。

VSで実行する場合は、プロジェクトに含まれるすべてのプロシージャのテキストが必要です。

0
µBio