web-dev-qa-db-fra.com

Trouver toutes les références à un objet dans une base de données SQL Server

J'essaie de trouver toutes les références à un objet dans une base de données SQL Server.

Comment puis-je rechercher rapidement? SQL Server Management Studio ne semble pas le faire. J'utilise http://www.red-gate.com/products/SQL_Search/ mais j'aimerais trouver la solution "officielle" de Microsoft pour cela. Est-ce dans un autre produit?

Par exemple, lorsque je fais une recherche en masse dans Visual Studio, j'aimerais pouvoir également trouver quelque chose dans toutes les procédures stockées.

Ou peut-être que je ne le code pas correctement?

Carl

18
Malartre

Utilisation:

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

... parce que SYSCOMMENTS et INFORMATION_SCHEMA.routines ont nvarchar (4000) colonnes. Donc, si "name_of_object" est utilisé à la position 3998, il ne sera pas trouvé. SYSCOMMENTS a plusieurs lignes, mais INFORMATION_SCHEMA.routines est tronqué.

38
OMG Ponies

Avec l'utilisation d'un SQL non documenté 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

J'utilise cette requête pour rechercher toutes les tables (ou le texte) dans les procédures stockées:

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

Si vous souhaitez utiliser OMG Ponies sql comme raccourci clavier dans SSMS, ajoutez le code SP suivant à votre base de données principale.

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

Ensuite, il vous suffit d’ajouter dbo.SP_FindAllReferences à vos raccourcis clavier pour pouvoir l’utiliser dans le contexte de toute base de données de votre serveur.

À votre santé!

NB: Si vous utilisez SQL Server 2005, vous devrez remplacer

@sql +=

avec

@sql = @sql +
1
DeanOC

J'ai trouvé une solution comme celle-ci ..

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

Je ne suis pas sûr de la manière 'officielle de Microsoft' mais j'ai déjà utilisé SqlDigger dans le passé. Ce n'est pas mauvais.

Si vous voulez le faire dans VS, vous aurez besoin du texte de tous vos procs inclus dans votre projet.

0
µBio

Dans SQL 2008, la DMV (fonction de gestion de données) sys.dm_sql_referencing_entities a été ajoutée. Son retourne tout objet qui fait référence à l'objet que vous lui transmettez.

SELECT * FROM sys.dm_sql_referencing_entities('dbo.Table1', 'OBJECT')
0
Krzysztof Gapski

SQL Server Management Studio dispose d'une fonctionnalité Afficher les dépendances lorsque vous cliquez avec le bouton droit de la souris sur un objet dans l'explorateur d'objets. Est-ce ce que vous cherchez?

0
David Atkinson