2016-04-05 11 views
0

Meine Firma verschiebt alle Berichtgenerierungstabellen auf einen anderen Server, und dazu müssen wir alle Instanzen finden, wo gespeicherte Prozeduren auf Live-Tabellen zugreifen und entfernen Sie diese Zugriffe und ersetzen Sie sie durch Zugriffe auf Snapshots. Es gibt ziemlich viele gespeicherte Prozeduren, die ich durchsehen muss, und meine Augen fangen an zu bluten und versuchen, durch jede Datei zu scrollen. Ich dachte, eine Regex wäre vielleicht am besten in jedem gespeicherten Proc nachzusehen. Gibt es vielleicht einen noch besseren Weg?In einem Stored Proc, nach Tabellennamen (vielleicht mit Regex?) Ausschließen von zwei Schemas

Ich bin auf der Suche nach allen Situationen, in denen ein FROM oder JOIN gefolgt von einer Tabelle, die nicht mit "Snapshot" oder "EDI" (zwei Schemas mit Berichten) beginnt. Ich bin mir sicher, dass jemand beim Unfall "FROM" getippt hat, also wäre die Groß-/Kleinschreibung nicht hilfreich. Ich versuche auch, \ s + zu machen, weil jemand versehentlich mehr als einen Zwischenraum dazwischen eingegeben hat.

Zum Beispiel auszuschließen suchen:

  • VON Snapshot
  • VON EDI
  • JOIN Snapshot
  • JOIN EDI

und die Groß- und Kleinschreibung Varianten

Ich habe das Tutorialgemacht, kommt aber immer noch kurz. Bisher habe ich:

[fFjJ] [RroO] [oOiI] [mmnn] \ s +^$

Irgendwelche Gedanken (Snap | Schnapp | SNAP | EDI | | edi Edi!)?

EDIT: Ich verwende die Regex in SSMS 2016 mit der Funktion Suchen und Ersetzen.

+0

Aus Neugier, wie viele gespeicherte Procs sprechen wir? Ich würde denken, dass es einfacher wäre, einen Namen auf dem Tisch zu machen (und nicht nach "von" und "beitreten" zu suchen) und dann mit der kurzen Liste, einen Menschen durchgehen und die falschen Positives heraussuchen. – Becuzz

+0

Wahrscheinlich 100 gespeicherte Procs. Ich möchte diese beiden Schemas ausschließen, da es Hunderte von möglichen Live-Tabellen gibt, auf die referenziert werden kann (alle im dbo-Schema, aber die Referenzen verwenden möglicherweise nicht das dbo-Qualifikationsmerkmal). Indem ich diese beiden Schemareferenzen ausschließe, bekomme ich die Daten, die ich leichter haben möchte. –

Antwort

1

Während ich nicht SSMS 2016 vor mir habe, scheinen die docs darauf hinzuweisen, dass dies funktioniert.

(FROM|JOIN)\s+~((Snapshot|Edi)\.):a*> 

Pannen

(FROM|JOIN)   --Match the word from or join 
\s+     --match at least one bit of whitespace 
~(     --don't call it a match if this comes next 
    (Snapshot|Edi)\. --the word Snapshot or Edi followed by a period 
)     --end of the don't match prefix 
:a*     --match any number of alphanumeric characters (this is your table name, so you may need a different character class depending on what characters you use in your tables) 
>     --match the end of a word 

Es sollte auch eine Option im Suchen und Ersetzen-Dialogfeld zu tun Groß- und Kleinschreibung Matching.

+0

Das ist ein guter Punkt. Wenn "Groß-/Kleinschreibung beachten" deaktiviert ist, funktioniert diese Regex tatsächlich für Kleinbuchstaben und andere Kombinationen. Vielen Dank! –

0

Es gibt einen viel besseren Weg gefunden Here on MSDN mit T-SQL. Ich muss immer noch SP mit SP, aber es ist viel schneller und weniger fehleranfällig als mit einer Regex und einige Grenzen zu vergessen.

SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name, 
    o.type_desc AS referencing_desciption, 
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id, 
    referencing_class_desc, 
    referenced_server_name, referenced_database_name, referenced_schema_name, 
    referenced_entity_name, 
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name, 
    is_caller_dependent, is_ambiguous 
FROM sys.sql_expression_dependencies AS sed 
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id 
WHERE referencing_id = OBJECT_ID(N'EDI.Populate_IHP_OHN_Eligibility_Report') 
    AND referenced_schema_name NOT IN ('EDI', 'Snapshot');