Compartilhar via


PROCEDIMIENTO ALMACENADO EN SQL SERVER PARA BUSCAR TEXTO EN LAS BASES DE DATOS.

Buenas,

En este post, queremos hablar de un procedimiento almacenado para buscar un texto determinado en alguna base de datos. Desde el punto de vista de soporte esto es bastante útil, a fin de tratar de encontrar determinadas cadenas de texto, en una base de datos u otras, y así poder determinar posibles causas de funcionamiento, error, etc.

Debemos ejecutar la siguiente consulta SQL en el Analizador De Consultas, en la base de datos en la cual queremos buscar el texto que nos interesa; si queremos que este procedimiento almacenado esté disponible para todas las bases de datos, debemos ejecutarlo en la base de datos master.

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

create PROC [dbo].[SearchAllTables](@SearchStr nvarchar(100)) AS

BEGIN

CREATE TABLE #Results (ColumnName text, ColumnValue text)

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)

SET @TableName = ''

SET @SearchStr2 = QUOTENAME('%' + rtrim(@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', 'uniqueidentifier','tinyint', 'smallint', 'int')

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 ' + 'rtrim(' + @SearchStr2 + ')'

)

END

END

END

SELECT ColumnName, ColumnValue FROM #Results print @searchstr2

END

Para usar este procedimiento almacenado, debemos ejecutarlo de la siguiente manera, en el Analizador de Consultas de SQL Server:

exec SearchAllTables '[texto a buscar]’

Esperamos os resulte de utilidad

Muchas gracias un saludo

Jorge Puig