Pagine

venerdì 9 settembre 2011

Cercare una stringa in un database...

Vi è mai capitato di dover cercare una stringa specifica all'interno del database senza conoscerne la struttura ? A me si e per evitare di farmi migliaia di select a mano ho creato un piccolo script che mi aiuta in modo molto efficace nella ricerca....

Utilizzo le viste information_schema che restituiscono la struttura del Db.
Vediamo come ho fatto :
--non voglio ricevere informazioni sul numero di righe selezionate
Set NoCount On

--Dichiarazione variabile contenente la stringa da ritrovare
Declare @strToFind varchar(max) = 'Luca'

--Dichiarazione variabili d'appoggio
Declare @strSchema sysname = ''
Declare @strTab sysname = ''
Declare @StrFieldsList varchar(Max) = ''
Declare @StrWhereFieldsList varchar(Max) = ''
Declare @strSql varchar(max) = ''

--variabile tabella contenente la le tabelle e i campi testuali
Declare @Tabs table(
TABLE_SCHEMA sysname
,TABLE_NAME sysname
)

Insert into @Tabs
Select Distinct TABLE_SCHEMA,TABLE_NAME from INFORMATION_SCHEMA.COLUMNS
Where DATA_TYPE in ('char','nchar','varchar','nvarchar')
Order by TABLE_SCHEMA,TABLE_NAME

--Fino a che ci sono righe nella variabile tabella
While 1=1
Begin

 --operazioni preliminari per formattare la select di ricerca
 Set @StrFieldsList = ''
 Set @StrWhereFieldsList = ''

 Select Top 1 @strSchema = TABLE_SCHEMA, @strTab=TABLE_NAME from @Tabs
 Order by TABLE_SCHEMA,TABLE_NAME;

 --Se la variabile tabella non mi ha restituito la prima riga esco dal ciclo
 --perchè ho esaurito le tabelle su cui implementare la ricerca
 IF @@ROWCOUNT=0
 Break;

 --Formatto la stringa per ricercare il mio dato
 With Fields
 AS
 (
 Select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
 Where DATA_TYPE in ('char','nchar','varchar','nvarchar','text','ntext')
 And TABLE_SCHEMA = @strSchema
 And TABLE_NAME = @strTab
 )
 Select @StrFieldsList = @StrFieldsList + '' + QUOTENAME(COLUMN_NAME) + ' AS ' + QUOTENAME(COLUMN_NAME) + ',',
 @StrWhereFieldsList = @StrWhereFieldsList + QUOTENAME(COLUMN_NAME) + ' Like ''%' + @strToFind + '%'' OR '
 From Fields

 Set @strSql = 'Select ''' + QUOTENAME(@strSchema) + ''' As Table_Schema,''' +    QUOTENAME(@strTab) + ''' As Table_Name, ' + Substring(@StrFieldsList,0,LEN(@StrFieldsList))
 + ' from ' + QUOTENAME(@strSchema) + '.' + QUOTENAME(@strTab)
 + ' Where ' + Substring(@StrWhereFieldsList,0,LEN(@StrWhereFieldsList)-2)

 --eseguo il comando di ricerca appena generato
 Exec(@strSql)

 -- elimino la riga relativa alla tabella appena elaborata
 -- dalla tabella temporanea
 Delete From @Tabs
 Where TABLE_SCHEMA = @strSchema
 And TABLE_NAME = @strTab

end

2 commenti:

  1. bravissimo e grazie 1000 è proprio quello che cercavo
    complimenti!

    RispondiElimina
  2. Complimenti,ha funzionato anche per me
    Grazie mille!

    RispondiElimina