Si të kërkoni shpejtazi për të dhënat dhe objektet në SQL Server databaza

Shpesh, zhvilluesit dhe Administratorët e Databazave (DBA) kanë nevojë për të kërkuar të dhëna apo objekte në databazë. Nëse ju do të kërkonit ndonjëherë për një funksion në një databazë që përmbanë një kolonë të caktuar të një tabele ose një emër të një variable, ose për një tabelë që përmbanë të dhëna të caktuara, ju do të shihni se nuk ka zgjidhje me një klik sikurse Ctrl+F.

Sikurse nuk ka ndonjë zgjidhje në SSMS (SQL Server Management Studio), as në Visual Studio, ja ku po i japim disa nga opcionet të cilat mund t’i përdorni:

Duke kërkuar të dhëna në tabela dhe view

Duke përdorur SQL për të kërkuar të dhëna të caktuara apo specifike në të gjitha tabelat dhe të gjitha kolonat e një database është pak sa largë nga një zgjidhje optimale dhe si duhet. Ka shumë skripta SQL të ndryshme që në mënyra mund të përdoren për të arritur këtë informacion, në të cilat zakonisht të gjitha përdorin kursor objekte dhe objekte sistemore.

DECLARE
   @SearchText varchar(200),
   @Table varchar(100),
   @TableID int,
   @ColumnName varchar(100),
   @String varchar(1000);
--modify the variable, specify the text to search for SET @SearchText = 'John';
DECLARE CursorSearch CURSOR
    FOR SELECT name, object_id
        FROM sys.objects
      WHERE type = 'U';
--list of tables in the current database. Type = 'U' = tables(user-defined) OPEN CursorSearch;
FETCH NEXT FROM CursorSearch INTO @Table, @TableID;
WHILE
       @@FETCH_STATUS
       =
       0
    BEGIN
        DECLARE CursorColumns CURSOR
            FOR SELECT name
                  FROM sys.columns
                WHERE
                       object_id
                       =
                       @TableID AND system_type_id IN(167, 175, 231, 239);
        -- the columns that can contain textual data        
--167 = varchar; 175 = char; 231 = nvarchar; 239 = nchar        
OPEN CursorColumns;
        FETCH NEXT FROM CursorColumns INTO @ColumnName;
        WHILE
               @@FETCH_STATUS
               =
               0
            BEGIN
                SET @String = 'IF EXISTS (SELECT * FROM '
                            + @Table
                            + ' WHERE '
                            + @ColumnName
                            + ' LIKE ''%'
                            + @SearchText
                            + '%'') PRINT '''
                            + @Table
                            + ', '
                            + @ColumnName
                            + '''';
                EXECUTE (@String);
                FETCH NEXT FROM CursorColumns INTO @ColumnName;
            END;
        CLOSE CursorColumns;
        DEALLOCATE CursorColumns;
        FETCH NEXT FROM CursorSearch INTO @Table, @TableID;
    END;
CLOSE CursorSearch;
DEALLOCATE CursorSearch;

Të metat e kësaj zgjidhje janë: përdorimi i kursorëve, të cilët në përgjithësi janë jo efikas, kompleksitet i lartë, kohë e gjatë që kërkohet për ekzekutim, madje edhe për databazat e vogëla. Një tjetër jo përparsi është se kjo mund të përdoret vetëm për kërkim të dhënat tekst. Që të kërkojmë të dhënat me tipe të tjera të të dhënash sikurse janë time dhe datetime, ju do të duhej të shkruani një kod të ri.

Duke kërkuar objekte

Kërkimi për një emër të një objekti apo definimit të saj në një databazë është pak sa më e lehtë se sa kërkimi i një teksti të caktuar apo specifik. Ka mënyra apo metoda të ndryshme që ju mund t’i përdorni. Megjithatë, të gjitha këto metoda përfshijnë edhe objektet sistemore.

Shembujt SQL në vazhdim, kërkojnë tekst të caktuar – @StartProductID variabla – në një Store Procedure. Kur kërkohet për objektet në një databazë tjetër me tipe të objekteve – Funksione, Triggera, Kolona etj. ose tipe të objekteve në shumë databaza në të njejtën kohë, SQL i paraqitur më lartë do të duhej të ndryshohet në mënyrë sa më të përshtatshme.

INFORMATION_SCHEMA.ROUTINES

Përdorni SQL që mund të pyesin view-t e INFORMATION_SCHEMA.ROUTINES për të kërkuar për parametra të caktuar në të gjitha procedurat. INFORMATION_SCHEMA.ROUTINES përmbajnë informacion rreth të gjitha procedurave dhe funksioneve në databazë. ROUTINE_DEFINITION kolonat përmbajnë burimin e shprehjeve apo kodit që janë krijuar funksionet ose Store Procedurat

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

Dhe rezultati është

Nuk rekomandohet që të përdoret INFORMATION_SCHEMA view-t për të kërkuar objektet që jan të ruajtura në kolonat e ROUTINE_SCHEMA. Në vend të tyre përdorni sys.objects.

sys.syscomments view

Kërkoni me view-t sys.syscomments të cilat përmbajnë informata rreth cdo store procedure, view, rule, default, trigger dhe Check & Default Contraints të një database. Pyetja apo Query që bëhet në këto, kontrollon tekstin e caktuar në kolonat text të cilat përmbajnë objektet DDL (Data Definition Language)

SELECT OBJECT_NAME( id )
  FROM SYSCOMMENTS
  WHERE text LIKE '%@StartProductID%' AND OBJECTPROPERTY(id , 'IsProcedure') = 1
  GROUP BY OBJECT_NAME( id );

Rezultati është:

Kjo metodë nuk rekomandohet sepse sys.syscomments do të largohet në versionet e ardhshme të SQL Server.

sys.sql_modules view

Duke bërë kërkim në sys.sql_modules view, e cila përmbanë emrin, tipin dhe definimin e cdo moduli në një databazë.

SELECT OBJECT_NAME( object_id )
  FROM sys.sql_modules
WHERE
       OBJECTPROPERTY(object_id , 'IsProcedure')
       =
       1 AND definition LIKE '%@StartProductID%';

Rezultatet jan të njejta sikurse nga metoda e mëhershme.

Tjera sys schema views

Kërkimi në sys.syscomments, sys.schemas dhe sys.objects view-t. sys.schema përmbanë një rreshtë për cdo skemë të një databaze. Sys.objects përmbajnë rreshta për cdo objekt të krijuar apo të definuar nga përdoruesi në databazë. Të keni kujdes se kjo nuk përmbanë informatën e trigger-ave prandaj ju do të duhej të përdorni sys.triggers që të kërkoni për emrat e objekteve ose definimin e tyre si trigger.

DECLARE
 @searchString nvarchar( 50 );
SET@searchString = '@StartProductID';
SELECT DISTINCT
    s.name AS Schema_Name , O.name AS Object_Name , C.text AS Object_Definition
FROM
     syscomments C INNER JOIN sys.objects O
                     ON
     C.id
     =
     O.object_id
                   INNER JOIN sys.schemas S
                   ON
     O.schema_id
     =
     S.schema_id
WHERE
    C.text LIKE
     '%'
   + @searchString
   + '%'
 OR O.name LIKE
     '%'
   + @searchString
   + '%'
ORDER BY
       Schema_name , Object_name;

Rezultati do të dukej:

Jo përparsia e këtyre metodave është se për cdo ndryshim në objektet e kërkuara, ju do të duhej të ndryshoni dhe SQL kodin. Që të keni mundësi për ta bërë këtë, ju duhet të jeni të familjarizuar me strukturën e objekteve sistemore ku do të mund të bëni modifikimin e tyre. Kërkimi në disa tipe të objekteve dhe duke shtuar kritera të tjera të kërkimit si përfshirja apo mospërfshirja e emrit dhe kodit të objektit ose definimi i ndonjë karakteri që nuk duhet përmbajtur, do të sjellë më shumë kompleksitet të SQL kodit, në të cilin mund të gabohet pa dashje and do të marr kohë të konsiderueshme gjatë testimit.

Nëse ju nuk jeni një zhvillues me përvojë, ju do të preferoni një zgjidhje të testuar dhe pa gabime për të kërkuar objekte dhe të dhëna SQL në mënyrë manuale, dhe ju nuk jeni të familjarizuar me objektet sistemore të cilat përmbajnë informacione DDL për objektet e databazës, përdorni ApexSQL Search.

ApexSQL Search është një kërkues SQL që mund të jetë i vendosur në SSMS dhe Visual Studio si add-in. Mund të kërkoj tekst në objektet e databazës (përfshirë emrin objekteve), të dhënave që jan të ruajtura në tabela dhe view (edhe në ato të kriptuara), dhe të përsëritni kërkimet e mëhershme me vetëm një klik.

Që të kërkoni për të dhëna në tabela dhe view:

  1. Në SQL Server Management Studio SSMS ose menunë kryesore të Visual Studio, klikoni ApexSQL Search
  2. Caktoni opcionin Database text search

  3. Në fushën Search text field, vendosni të dhënën që dëshironi ta kërkoni.
  4. Nga menun drop-down për Database caktoni databazën në të cilën do bëni kërkimin.
  5. Select objects to search caktoni tabelat dhe view-të për të kërkuar ose lëreni që të gjitha të selektuara.
  6. Caktoni nëse do të duhej të kërkoni në view, vlerë numerike, tipin e tekstit, uniqueidentifier dhe kolonat që përmbajnë të dhëna kalendarike apo date, duke selektuar apo caktuar me kutit kontrollit (check boxes) përkatës apo nëse do të duhej të kërkoni për vlerat e sakta. Nëse kërkoni në kolonat kalendarike (date) cakto formatin e datës:

    ApexSQL Search - Database text search

  7. Klikoni opcionin Find now. Paraqitja e rezultati do të paraqes tabelat dhe view-t të cilat përmbajnë vlerën që është shtypur gjatë kërkimit.

    ApexSQL Search - Database text search

  8. Klikoni në butonin e paraqitur me tri pika në formë të gjurmëve … në kolonën Column value për të shikuar detajet e objektit të gjetur.

    ApexSQL Search - Database search details

Që të kërkojmë për objektet:

  1. Në SSMS SQL Server Management Studio ose menunë kryesore të Visual Studios nga menuja ApexSQL, klikoni ApexSQL Search
  2. Caktoni apo selektoni opcionin Database object search…

    ApexSQL Search - Database search details

  3. Në fushën Search text field vendosni tekstin që ju dëshironi të kërkoni (psh. Emrin e një variable)
  4. Nga drop-dwon menuja Database, caktoni se në cilën databazë do të kërkoni.
  5. Në listën drop-down Objects, caktoni tipin e objektit që do ta kërkoni ose lërni të gjitha të selektuara.
  6. Caktoni nëse do të kërkoni objekt, kolonë, emrin e index-it, objekt sistemor, duke I klikuar kutit për selektim përkatës ose për kërkim të saktë ose cfarë krakteri hequr nga kërkimi.
  7. Klikoni opcionin Find now:

    ApexSQL Search - Database object search

    Rezultati do të paraqitet me objektet e databazës të cilat e përmbajnë vlerën apo tekstit e kërkuar.

  8. Duke bërë klik të dyfisht në Database object search dmth objektin e gjetura pas kërkimit tek rezultati i paraqitur me objekte, do të na dërgoj saktësisht tek objekti duke u theksuar pozicioni tek Object Explorer në anën e majtë.

    ApexSQL Search - Database object search

SQL Server Management Studio dhe Visual Studio nuk kan opcionet për kërkim të një objekti në databazë apo të dhënave në databazë. SQL pyetësorët për kërkime të tilla jan komplekse, të ngadalshme dhë kërkojnë njohuri të objekteve sistemore të SQL Server. Përdorni ApexSQL Search që të kërkoni në databazat e juaja dhe të gjeni të dhëna e objekte që ju duhen sipas kërkesave tuaja.

Përkthyes: Dukagjin Maloku

October 20, 2015