I finally came back to the following solution :
CREATE FUNCTION [dbo].[SEARCH_SINGLE] (
@langId INT = 4,
@searchString VARCHAR(MAX) = NULL
)
RETURNS TABLE
AS
RETURN
WITH
words AS (
SELECT * FROM [dbo].splitstring(@searchString, ' ')
),
results AS (
SELECT DISTINCT
a.[ID] as Id,
a.[LASTNAME] as LastName,
a.[FIRSTNAME] as FirstName,
d.[COUNTRY_LABEL] as CountryLabel,
c.[CITY] as City,
j.[PROMO_YEAR] as PromoYear,
CASE WHEN EXISTS(SELECT t2.Name FROM words t2 WHERE a.[FIRSTNAME] like '%'+t2.Name+'%') THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT t2.Name FROM words t2 WHERE a.[LASTNAME] like '%'+t2.Name+'%') THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT t2.Name FROM words t2 WHERE c.[CITY] like '%'+t2.Name+'%') THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT t2.Name FROM words t2 WHERE j.[PROMO_YEAR] like '%'+t2.Name+'%') THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT t2.Name FROM words t2 WHERE e.[EMPLOYOR] like '%'+t2.Name+'%') THEN 1 ELSE 0 END as Nb
FROM
...
WHERE
...
)
SELECT
Id,
LastName,
FirstName,
CountryLabel,
City,
PromoYear,
FROM
results
WHERE
Nb = (SELECT MAX(Nb) FROM results)
AND Nb <> 0
- I search for each word on each column.
- I give a "score" for each record.
- I return only records that have the best score.
It seems to cover all my requirements.