Løst: find kolonne i alle lagrede procedurer sql-server

Sidste ændring: 09/13/2023

Når du arbejder med store databaser i SQL Server, kan du uundgåeligt støde på en situation, hvor du skal finde en bestemt kolonne på tværs af alle lagrede procedurer. Dette kan dukke op, hvis du omfaktorerer din kode, jager fejl eller blot er nysgerrig efter brugen af ​​en kolonne i dine procedurer. Uanset årsagen kan det virke som en skræmmende opgave at lokalisere en kolonne i SQL Server, men ærgr dig ikke – med det rigtige SQL-script kan dette gøres hurtigt og nemt.

Vi kan opnå dette ved at bruge `INFORMATION_SCHEMA.ROUTINES`-tabellen eller `sys.sql_modules`, hvor teksten til hver procedure er gemt i SQL-serveren.

[b] Lad os tage et praktisk overblik over, hvordan man finder kolonne i alle lagrede procedurer i SQL Server. [/b]

Løsningsoversigt

Vores grundlæggende strategi vil være at forespørge i `INFORMATION_SCHEMA.ROUTINES`-tabellen (eller `sys.sql_modules`) for at hente definitionen af ​​hver lagret procedure. Vi kan derefter bruge "LIKE"-sætningen til at søge efter vores kolonne inden for disse definitioner. Så enkelt er det!

Hvis du ønsker at opnå dette i dit eget SQL Server-miljø, kan du bruge denne generiske forespørgsel:

SELECT 
    ROUTINE_NAME, ROUTINE_DEFINITION
FROM 
    INFORMATION_SCHEMA.ROUTINES 
WHERE 
    ROUTINE_DEFINITION LIKE '%ColumnName%'
    AND ROUTINE_TYPE='PROCEDURE'

Trin-for-trin kodeforklaring

1. Valg af de nødvendige oplysninger

Vi starter med at vælge `ROUTINE_NAME` og `ROUTINE_DEFINITION` fra `INFORMATION_SCHEMA.ROUTINES`.

2. Filtrering af definitionen

Derefter bruger vi en `WHERE`-sætning til at filtrere `ROUTINE_DEFINITION`. Vi er kun interesseret i de rækker, hvor `ROUTINE_DEFINITION` indeholder vores kolonnenavn.

3. Begrænsning til lagrede procedurer

Til sidst tilføjer vi en anden betingelse i `WHERE`-sætningen for at begrænse vores resultatsæt til kun de rutiner, der er lagrede procedurer.

Alternativ tilgang ved hjælp af sys.sql_modules

Ovenstående forespørgsel vil fungere perfekt til at finde kolonnenavn i den lagrede procedure. Der er dog en alternativ måde at få den samme information på. Vi kan bruge `sys.sql_modules` systemvisning til at få teksten til SQL Server-modulerne. Det inkluderer definitioner af lagrede procedurer, funktioner, triggere osv.

SELECT Object_name(sm.object_id) as name, sm.definition
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE sm.definition like '%ColumnName%'
AND type_desc = 'SQL_STORED_PROCEDURE'

Brug af SQL jokertegn

SQL jokertegn kan være meget nyttige her. Hvis du er usikker på, om mellemrum eller andre tegn kan komme foran eller efter dit kolonnenavn, kan du bruge jokertegnet `%` som så `'% ColumnName %'` til at omfatte alle tegn, der måtte være til stede.

Med disse enkle trin kan du nu nemt finde en kolonne gennem alle dine lagrede procedurer i SQL server. Nytten af ​​en sådan funktion er ikke begrænset til at finde kolonner, men strækker sig til enhver tekst, du ønsker at se på tværs af dine lagrede procedurer.

Relaterede indlæg: