Strādājot ar lielām datu bāzēm SQL Server, jūs neizbēgami varat saskarties ar situāciju, kad jums ir jāatrod konkrēta kolonna visās saglabātajās procedūrās. Tas var rasties, ja pārveidojat savu kodu, meklējat kļūdas vai vienkārši interesējaties par kolonnas izmantošanu savās procedūrās. Neatkarīgi no iemesla kolonnas atrašana SQL Server var šķist biedējošs uzdevums, taču neuztraucieties — ar pareizo SQL skriptu to var padarīt ātri un vienkārši.
Mēs to varam panākt, izmantojot tabulu `INFORMATION_SCHEMA.ROUTINES` vai `sys.sql_modules`, kur katras procedūras teksts tiek glabāts SQL serverī.
[b] Apskatīsim praktisku skatījumu uz to, kā atrast kolonnu visās SQL Server saglabātajās procedūrās. [/b]
Risinājuma pārskats
Mūsu pamata stratēģija būs vaicājums tabulā INFORMATION_SCHEMA.ROUTINES (vai 'sys.sql_modules'), lai izgūtu katras saglabātās procedūras definīciju. Pēc tam mēs varam izmantot paziņojumu LIKE, lai meklētu mūsu kolonnu šajās definīcijās. Tas ir tik vienkārši!
Ja vēlaties to paveikt savā SQL Server vidē, varat izmantot šo vispārīgo vaicājumu:
SELECT
ROUTINE_NAME, ROUTINE_DEFINITION
FROM
INFORMATION_SCHEMA.ROUTINES
WHERE
ROUTINE_DEFINITION LIKE '%ColumnName%'
AND ROUTINE_TYPE='PROCEDURE'
Soli pa solim koda skaidrojums
1. Nepieciešamās informācijas atlasīšana
Mēs sākam, atlasot ROUTINE_NAME un ROUTINE_DEFINITION no INFORMATION_SCHEMA.ROUTINES.
2. Definīcijas filtrēšana
Pēc tam mēs izmantojam klauzulu WHERE, lai filtrētu ROUTINE_DEFINITION. Mūs interesē tikai tās rindas, kurās ROUTINE_DEFINITION ir mūsu kolonnas nosaukums.
3. Ierobežojumi ar saglabātajām procedūrām
Visbeidzot, mēs pievienojam vēl vienu nosacījumu klauzulā WHERE, lai ierobežotu mūsu rezultātu kopu tikai tām rutīnām, kas ir saglabātas procedūras.
Alternatīva pieeja, izmantojot sys.sql_modules
Iepriekš minētais vaicājums lieliski darbosies, lai saglabātajā procedūrā atrastu kolonnas nosaukumu. Tomēr ir alternatīvs veids, kā iegūt to pašu informāciju. Mēs varam izmantot `sys.sql_modules` sistēmas skatu, lai iegūtu SQL Server moduļu tekstu. Tas ietver saglabāto procedūru, funkciju, trigeru u.c. definīcijas.
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'
SQL aizstājējzīmju izmantošana
SQL aizstājējzīmes šeit var būt ļoti noderīgas. Ja neesat pārliecināts, vai pirms kolonnas nosaukuma var būt atstarpes vai citas rakstzīmes, varat izmantot aizstājējzīmi `%`, piemēram, `'% ColumnName %'`, lai ietvertu visas iespējamās rakstzīmes.
Veicot šīs vienkāršās darbības, tagad varat viegli atrast kolonnu visās SQL serverī saglabātajās procedūrās. Šādas funkcijas lietderība neaprobežojas tikai ar kolonnu atrašanu, bet attiecas uz jebkuru tekstu, kuru vēlaties pamanīt savās saglabātajās procedūrās.
