Stampa
Categoria: SQL
Visite: 14377
Stella inattivaStella inattivaStella inattivaStella inattivaStella inattiva
 

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 -

REFERENCES