Seguramente en más de una ocasión te haz encontrado en la situación de querer saber si una palabra, frase o mejor dicho un registro cualquiera existe en una tabla, pero no sabes en qué columna buscar, ya que si supieses la columna bastaría con que hagas una sentencia SELECT, sin embargo hay situaciones en las que quieres asegurarte de la existencia de dicho registro en más de una columna o mejor aún, en todas las columnas de una tabla.
Esta situación es justamente la que aquí vamos a abordar y dar solución, este artículo será de T-SQL.
Si no sabes de bases de datos te recomiendo que empieces con mi artículo Lo que un desarrollador debe saber sobre bases de datos.
Vamos al script en T-SQL, y es el siguiente:
DECLARE @table VARCHAR(50);
DECLARE @stringToFind VARCHAR(100)
SET @table = 'tu_tabla'
SET @stringToFind = 'tu_cadena_a_buscar'
BEGIN TRY
DECLARE @sqlCommand varchar(max) = 'SELECT * FROM [' + @table + '] WHERE '
SELECT @sqlCommand = @sqlCommand + '[' + COLUMN_NAME + '] LIKE ''' + @stringToFind + ''' OR '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table
AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar','int','decimal')
SET @sqlCommand = left(@sqlCommand,len(@sqlCommand)-3)
EXEC (@sqlCommand)
PRINT @sqlCommand
END TRY
BEGIN CATCH
PRINT 'There was an error. Check to make sure object exists.'
PRINT error_message()
END CATCH
En las líneas 3 y 4 es donde pones tu tabla y tu cadena a buscar, ojo que en la cadena a buscar puedes incluir % para insertar comodines de búsqueda y no tener la necesidad de tener que poner el texto completo y exacto.
Ejemplo práctico
Tengo una base de datos con una tabla llamada PRODUCTO y tiene 262 registros:
Quiero buscar a todos los productos CRUSH pero que no sólo busque en la columna descripción ya que puede ser que la descripción no incluya la marca, quiero que busque a los productos CRUSH en todas las columnas y me los traiga, entonces adapto mi query y ejecuto:
DECLARE @table VARCHAR(50);
DECLARE @stringToFind VARCHAR(100)
SET @table = 'producto'
SET @stringToFind = 'crush%'
BEGIN TRY
DECLARE @sqlCommand varchar(max) = 'SELECT * FROM [' + @table + '] WHERE '
SELECT @sqlCommand = @sqlCommand + '[' + COLUMN_NAME + '] LIKE ''' + @stringToFind + ''' OR '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table
AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar','int','decimal')
SET @sqlCommand = left(@sqlCommand,len(@sqlCommand)-3)
EXEC (@sqlCommand)
PRINT @sqlCommand
END TRY
BEGIN CATCH
PRINT 'There was an error. Check to make sure object exists.'
PRINT error_message()
END CATCH
Obtengo lo siguiente:
Nota cómo en este caso buscando en todas las columnas traemos también aquellos registros que tienen un nombre incompleto o un error de tipeo como es el caso de los registros 6 y 7 de la imagen.
Y así es como pasamos de 262 a 7 registros, un número sin duda muchísimo más manejable.
Alguien podría decir, sí pero eso pude haberlo hecho haciendo una selección a toda la tabla, pasándola a excel y luego filtrando o buscando, y es cierto puedes hacerlo pero son muchos pasos y de lo que se trata es de mejorar y además automatizar tareas como ésta, y hacerlo mejor y más rápido, no lo olvides 😉 si ya existe la técnica de hacerlo bien, pues utilízala!.
Eso fue todo por ahora, espero te haya servido este post crack! 🎉
Más adelante seguiremos con este tipo de querys que nos facilitan un montón la vida a los desarrolladores y tambien a quienes administran bases de datos, en especial SQL Server.
Si esta entrada te ha gustado no dudes en compartirla crack! 💪😊
no me sirve
Estos querys son especializados, tienen un target, y por eso no son para todos, espero encuentres lo que buscas pronto, éxitos! 😉