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! 馃槈