SQL Serverデータベース内のオブジェクトへのすべての参照を検索しようとしています。
どうすればすばやく検索できますか? SQL Server Management Studioはそれをしていないようです。私は http://www.red-gate.com/products/SQL_Search/ を使用していますが、これに対する "公式"のMicrosoftソリューションを見つけたいです。別の製品にありますか?
たとえば、ビジュアルスタジオで一括検索を行う場合、すべてのストアドプロシージャで何かを検索できるようにしたいと考えています。
それとも私はこれを正しい方法でコーディングしていませんか?
カール
使用する:
select object_name(m.object_id), m.*
from sys.sql_modules m
where m.definition like N'%name_of_object%'
...SYSCOMMENTS
とINFORMATION_SCHEMA.routines
nvarchar(4000)列があります。したがって、「name_of_object」が位置3998で使用されている場合、それは見つかりません。 SYSCOMMENTS
には複数の行がありますが、INFORMATION_SCHEMA.routines
は切り捨てます。
SQL 2008では、DMV(データ管理関数)sys.dm_sql_referencing_entitiesが追加されました。渡したオブジェクトを参照するオブジェクトを返します。
SELECT * FROM sys.dm_sql_referencing_entities('dbo.Table1', 'OBJECT')
パーティーに遅れるが...
システムプロシージャ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で生きていてキックしています。
ドキュメントに記載されていない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
SQL Server Management Studioには、オブジェクトエクスプローラーでオブジェクトを右クリックすると、依存関係の表示機能があります。これはあなたが探しているものですか?
このクエリを使用して、ストアドプロシージャ内のすべてのテーブル(またはテキスト)を検索します。
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'
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 +
私はこのような解決策を見つけました。
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
「公式のマイクロソフト」のやり方はよくわかりませんが、以前は SqlDigger を使用しました。悪くない。
VSで実行する場合は、プロジェクトに含まれるすべてのプロシージャのテキストが必要です。