09/09/11

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','text','ntext')
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

0 commenti:

Posta un commento

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Grants For Single Moms