Montando un buscador ha surgido la típica funcionalidad de que si introduces una frase, el cliente quiere que se busque por las palabras sueltas no por la frase. Normalmente lo hago desde PHP/Coldfusion (o lo que sea) creando dinámicamente que query pero buscando soluciones alternativas que pueda ejecutar desde un procedimiento almacenado (sin hacer un exec que queda feo) he encontrado esta posible solución:
declare @terminos varchar(max);
set @terminos = 'zapatos bolsos vestidos bufandas';
declare @cadena table (cadena varchar(500))
insert into @cadena values (@terminos)
;WITH Vals AS (
SELECT cadena,
CAST('<d>' + REPLACE(cadena, ' ', '</d><d>') + '</d>' AS XML) XmlColumn
FROM @cadena
)
SELECT C.value('.','varchar(max)') palabra
FROM Vals
CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C)
where len(C.value('.','varchar(max)')) > 1
-- Este último where es para que solo coja las palabras con longitud superior a un carácter
Y esto lo implementaríamos por ejemplo insertando las palabras sueltas en una tabla que usemos luego para hacer un inner join de la siguiente forma:
declare @palabras table (palabra varchar(500))
insert into @palabras
SELECT C.value('.','varchar(max)') palabra
FROM Vals
CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C)
where len(C.value('.','varchar(max)')) > 1
-- y la consulta resultante sería asi:
select * from productos p
inner join @palabras tmp on p.descripcion like '%'+tmp.palabra+'%'