it-swarm.com.de

Suchen Sie alle Verweise auf ein Objekt in einer SQL Server-Datenbank

Ich versuche, alle Verweise auf ein Objekt in einer SQL Server-Datenbank zu finden.

Wie kann ich schnell suchen? SQL Server Management Studio scheint dies nicht zu tun. Ich verwende http://www.red-gate.com/products/SQL_Search/ , möchte aber die "offizielle" Microsoft-Lösung dafür finden. Ist es in einem anderen Produkt?

Wenn ich beispielsweise eine Massensuche in Visual Studio durchführe, möchte ich in der Lage sein, auch in allen gespeicherten Prozeduren etwas zu finden.

Oder codiere ich das nicht richtig?

Carl

18
Malartre

Benutzen:

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

... weil SYSCOMMENTS und INFORMATION_SCHEMA.routines nvarchar (4000) -Spalten haben. Wenn also "name_of_object" an Position 3998 verwendet wird, wird es nicht gefunden. SYSCOMMENTS hat mehrere Zeilen, aber INFORMATION_SCHEMA.routines wird abgeschnitten.

38
OMG Ponies

Sehr spät zur Party, aber ...

Sie können das System proc sys.sp_depends verwenden:

exec sys.sp_depends 'object_name'

Das Ergebnis ist eine Tabelle, in der alle Datenbankobjekte aufgelistet sind, die von (d. H. Referenz) object_name Abhängen. Jede Zeile enthält den Namen und den Typ des verweisenden Objekts sowie weitere Info-Spalten, abhängig vom Typ von object_name.


Hinweis: Dieser Proc wurde in MS SQL Server 2008 hinzugefügt.

Siehe: MSDN-Dokumente

Die Dokumentation besagt, dass dieser Prozess möglicherweise in einer zukünftigen Version entfernt wird und stattdessen sys.dm_sql_referencing_entities verwendet wird, aber er ist noch am Leben und in vollem Gange in MS SQL 2017.

2
David R Tribble

Mit der Verwendung eines undokumentierten 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

Mit dieser Abfrage suche ich nach allen Tabellen (oder Texten) in den gespeicherten Prozeduren:

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

Wenn Sie OMG Ponies sql als Tastenkürzel in SSMS verwenden möchten, fügen Sie Ihrer Master-Datenbank das folgende SP hinzu.

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

Dann müssen Sie nur noch dbo.SP_FindAllReferences zu Ihren Tastaturkürzeln hinzufügen und können es dann im Kontext einer beliebigen Datenbank auf Ihrem Server verwenden.

Prost!

NB: Wenn Sie SQL Server 2005 verwenden, müssen Sie ersetzen

@sql +=

mit

@sql = @sql +
1
DeanOC

Ich habe eine Lösung wie diese gefunden.

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

Ich bin mir nicht sicher, wie "offiziell" Microsoft vorgeht, aber ich habe in der Vergangenheit SqlDigger verwendet. Es ist nicht schlecht.

Wenn Sie dies in VS tun möchten, benötigen Sie den Text aller in Ihrem Projekt enthaltenen Procs.

0
µBio

In SQL 2008 wurde die DMV (Data Management Function) sys.dm_sql_referencing_entities hinzugefügt. Es gibt jedes Objekt zurück, das auf das übergebene Objekt verweist.

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

SQL Server Management Studio verfügt über eine Funktion zum Anzeigen von Abhängigkeiten, wenn Sie im Objekt-Explorer mit der rechten Maustaste auf ein Objekt klicken. Ist es das, wonach du suchst?

0
David Atkinson