it-swarm.com.de

Finden Sie alle gespeicherten Prozeduren, die auf eine bestimmte Spalte in einer Tabelle verweisen

Ich habe einen Wert in einer Tabelle, der unerwartet geändert wurde. Die betreffende Spalte ist CreatedDate: Dies wird festgelegt, wenn mein Artikel erstellt wird, aber von einer gespeicherten Prozedur geändert wird.

Kann ich eine Art SELECT-Anweisung schreiben, um alle Prozedurnamen, die auf diese Spalte verweisen, aus meiner Tabelle zu erhalten?

31
Pomster

Eine Möglichkeit ist das Erstellen einer Skriptdatei.

Klicken Sie mit der rechten Maustaste auf die Datenbank -> Aufgaben -> Skripts erstellen

Dann können Sie alle gespeicherten Prozeduren auswählen und das Skript mit allen SPs generieren. So finden Sie die Referenz von dort.

Oder

-- Search in All Objects
SELECT OBJECT_NAME(OBJECT_ID),
definition
FROM sys.sql_modules
WHERE definition LIKE '%' + 'CreatedDate' + '%'
GO

-- Search in Stored Procedure Only
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'CreatedDate' + '%'
GO

Source SQL SERVER - In gespeicherter Prozedur verwendete Spalte finden - Gespeicherte Prozedur nach Spaltennamen suchen

46
huMpty duMpty

Wenn Sie gespeicherte Prozeduren nur mit bestimmten Spalten abrufen möchten, können Sie die folgende Abfrage versuchen: 

SELECT DISTINCT Name
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%CreatedDate%';

Wenn Sie gespeicherte Prozeduren mit bestimmten Tabellenspalten abrufen möchten, können Sie die folgende Abfrage verwenden:

SELECT DISTINCT Name 
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%tbl_name%'
AND OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%';
24
Akash KC

Sie können ApexSQL Search verwenden. Dies ist ein kostenloses SSMS- und Visual Studio-Add-In und kann alle Objekte auflisten, die auf eine bestimmte Tabellenspalte verweisen. Es kann auch Daten finden, die in Tabellen und Ansichten gespeichert sind. Sie können die Ergebnisse leicht filtern, um einen bestimmten Datenbankobjekttyp anzuzeigen, der auf die Spalte verweist

enter image description here

Disclaimer: Ich arbeite für ApexSQL als Support Engineer

21
Milena Petrovic

Sie können die in information_schema enthaltenen system-Views für search in den Tabellen, views und (unverschlüsselten) gespeicherten Prozeduren mit einem Skript verwenden. Ich habe vor einiger Zeit ein solches Skript entwickelt, weil ich überall in der Datenbank nach Feldnamen suchen musste.

Das folgende Skript listet zuerst die Tabellen/Ansichten mit dem gesuchten Spaltennamen und dann den Quellcode der gespeicherten Prozeduren auf, in dem die Spalte gefunden wird. Es zeigt das Ergebnis in einer Tabelle an, die "BASE TABLE", "VIEW" und "PROCEDURE" und (optional) den Quellcode in einer zweiten Tabelle unterscheidet:

DECLARE @SearchFor nvarchar(max)='%CustomerID%' -- 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 
  union
  select '['+routine_Schema+'].['+routine_Name+']' [schema_object], 
         'PROCEDURE' as table_type from information_schema.routines
  where routine_definition 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 
  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
      and routine_type='procedure'
      order by routine_name
    end
end

Wenn Sie die Abfrage ausführen, verwenden Sie die Option "result as text" - dann können Sie mit "find" den Suchtext in der Ergebnismenge finden (nützlich für langen Quellcode).

Hinweis, mit dem Sie @DisplaySPSource auf 0 setzen können, wenn Sie nur die Namen SP anzeigen möchten und wenn Sie nur nach Tabellen/Ansichten suchen, nicht jedoch nach SPs, können Sie @SearchSP auf 0 setzen.

Beispielergebnis (CustomerID in der Northwind-Datenbank suchen, Ergebnisse werden über LinqPad angezeigt):

 Sample Result

Note, das ich dieses Skript mit einer Testansicht dbo.TestOrders Verifiziert habe, und fand die CustomerID in dieser Ansicht, obwohl c.* in der SELECT-Anweisung verwendet wurde (die referenzierte Tabelle Customers enthält die CustomerID und daher die Ansicht Säule).

2
Matt

versuche dies..

SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%'
GO

oder Sie können Skripte aller Prozeduren generieren und von dort aus suchen.

1
Nitu Bansal

ich hatte das gleiche Problem und fand heraus, dass Microsoft ein systable hat, das Abhängigkeiten zeigt.

SELECT 
    referenced_id
    , referenced_entity_name AS table_name
    , referenced_minor_name as column_name
    , is_all_columns_found
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT'); 

Und das funktioniert sowohl mit Views als auch mit Triggers.

1
Rafa Barragan

Sie können die folgende Abfrage verwenden, um die Werte zu identifizieren. Beachten Sie jedoch, dass Sie dadurch nicht die Ergebnisse einer verschlüsselten gespeicherten Prozedur erhalten.

SELECT DISTINCT OBJECT_NAME(comments.id) OBJECT_NAME
    ,objects.type_desc
FROM syscomments comments
    ,sys.objects objects
WHERE comments.id = objects.object_id
    AND TEXT LIKE '%CreatedDate%'
ORDER BY 1
0