martes, 26 de junio de 2018

127. Buscar un dato dentro de toda una base de SQL server

Si bien esta es la peor idea que podemos tener, por que si tenemos tablas muy grandes el tiempo de búsqueda será muy alto además que al no tener índices por todas las columnas (ni intenten hacer esto, por que los índices deben estar apegados a los queries, y deberíamos trabajar del índice hacia el query,para tener los campos en orden y realmente poderlos ocupar), sobrecargamos el motor de la base de datos.


Bueno en que momento es necesario, es necesario cuando la base de datos no tiene un modelo, que esta se desarrollo de forma caótica, y que la información se encuentra perdida o duplicada.


Les dejo el Query, úsenlo con cuidado, y si lo van a usar en producción cuiden que no tengan en línea usuarios, que sea en una ventana de tiempo


declare @StrValorBusqueda nvarchar(100)
set @StrValorBusqueda = '[palabra a buscar]'
CREATE TABLE #Resultado (NombreColumna nvarchar(370), ValorColumna nvarchar(3630))
SET NOCOUNT ON
DECLARE @NombreTabla nvarchar(256),
@NombreColumna nvarchar(128),
@StrValorBusqueda2 nvarchar(110)
SET @NombreTabla = ''
SET @StrValorBusqueda2 = QUOTENAME('%' + @StrValorBusqueda + '%','''')
WHILE @NombreTabla IS NOT NULL
BEGIN
print @NombreTabla
SET @NombreColumna = ''
SET @NombreTabla =
(SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @NombreTabla
AND OBJECTPROPERTY(
OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0)
WHILE (@NombreTabla IS NOT NULL) AND (@NombreColumna IS NOT NULL)
BEGIN
--print '----' + @NombreColumna
SET @NombreColumna =
(SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@NombreTabla, 2)
AND TABLE_NAME = PARSENAME(@NombreTabla, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @NombreColumna)
IF @NombreColumna IS NOT NULL
BEGIN
INSERT INTO #Resultado
EXEC
('SELECT ''' + @NombreTabla + '.' + @NombreColumna + ''', LEFT(' + @NombreColumna + ', 3630)
FROM ' + @NombreTabla + ' (NOLOCK) ' + ' WHERE ' + @NombreColumna + ' LIKE ' + @StrValorBusqueda2)
END
END
END
SELECT NombreColumna, ValorColumna FROM #Resultado



Felices líneas