Di recente ho avuto la necessità di "sbirciare" in un database di cui non avevo la documentazione. Volevo trovare la tabella dove era memorizzata una data parola.
Le tabelle erano circa 1000 quindi il compito da subito mi è sembrato abbastanza noioso. Così prima di intreprendere il cammino lungo e noioso di aprire tutte le tabelle, ho fatto una ricerca su google per capire se qualcuno aveva realizzato uno script SQL che potesse aiutarmi.
Bene, nel forum di SQL Server Central ho trovato un post con una store procedure che come compito ha proprio quello di cercare un stringa all'interno di tutte le tabelle.
Al sottoscritto ha risolto il problema, comunque ho notato che ha il limite di cercare solo stringhe, ma penso che sia adattabile per cercare anche numeri e date.
La Store Procedure è stata realizzata per MSSQL, non sarebbe male adattarla ad altri ambienti.
Ecco lo script in cui la prima riga rappresenta come utilizzare la store procedure.
EXEC SearchAllTables 'Computer' CREATE PROC SearchAllTables ( @SearchStr nvarchar(100) ) AS BEGIN CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) SET NOCOUNT ON DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) SET @TableName = '' SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') WHILE @TableName IS NOT NULL BEGIN SET @ColumnName = '' SET @TableName = ( SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName AND OBJECTPROPERTY( OBJECT_ID( QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) ), 'IsMSShipped' ) = 0 ) WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) BEGIN SET @ColumnName = ( SELECT MIN(QUOTENAME(COLUMN_NAME)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2) AND TABLE_NAME = PARSENAME(@TableName, 1) AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') AND QUOTENAME(COLUMN_NAME) > @ColumnName ) IF @ColumnName IS NOT NULL BEGIN INSERT INTO #Results EXEC ( 'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' + ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 ) END END END SELECT ColumnName, ColumnValue FROM #Results END
- have fun -