Что вы ожидаете получить при поиске пустого или нулевого значения? ожидаете ли вы, что запрос ничего не даст, или ожидаете, что он вернет что-то еще.
Если вы хотите, чтобы он ничего не возвращал, то лучше всего сделать что-то вроде этого:
DECLARE @pSearchFor AS NVARCHAR(100);
SET @pSearchFor = 'SomeKeyword';
IF @pSearchFor IS NOT NULL AND @pSearchFor <> ''
BEGIN
SELECT MS.[ModuleScreenID] AS ScreenID
,MS.[ModuleScreenCode] AS ScreenCode
,M.[Description] AS ModuleDescription
,M.[ModuleCode] AS ModuleCode
,FT.[Rank]
FROM ModuleScreen MS
JOIN Module M ON MS.ModuleID = M.ModuleID
JOIN CONTAINSTABLE(ModuleScreen, *, @pSearchFor) FT ON MS.ModuleScreenID = FT.[KEY]
END
ELSE
BEGIN
SELECT MS.[ModuleScreenID] AS ScreenID
,MS.[ModuleScreenCode] AS ScreenCode
,M.[Description] AS ModuleDescription
,M.[ModuleCode] AS ModuleCode
,FT.[Rank]
FROM ModuleScreen MS
JOIN Module M ON MS.ModuleID = M.ModuleID
END
edit: исправлена ошибка, из-за которой теперь возвращаются все записи, когда указана пустая или пустая строка.
Если у вас более 2 запросов таблиц CONTAINS с разными строками поиска, я бы посоветовал вам сгенерировать запрос с использованием динамического SQL, поскольку его было бы намного проще поддерживать, чем цепочку из 2 ^ n почти одинаковых запросов
Редактировать: рассмотрев способ сделать это без использования нескольких копий, используя временную таблицу, подобную этой:
DECLARE @pSearchFor AS NVARCHAR(100);
SET @pSearchFor = 'SomeKeyword';
SELECT * INTO #temp FROM CONTAINSTABLE(ModuleScreen, *, @pSearchFor)
SELECT MS.[ModuleScreenID] AS ScreenID
,MS.[ModuleScreenCode] AS ScreenCode
,M.[Description] AS ModuleDescription
,M.[ModuleCode] AS ModuleCode
,FT.[Rank]
FROM Module M
JOIN ModuleScreen MS ON MS.ModuleID = M.ModuleID AND (
(1 = CASE WHEN ISNULL(@pSearchFor, '') = '' THEN 1 ELSE 0 END
OR CONTAINS(MS.*, @pSearchFor)
LEFT OUTER JOIN #temp FT ON MS.ModuleScreenID = FT.[Key]
Это должно дать вам то, что вы хотите, без необходимости дублировать вещи, однако вы можете захотеть еще больше ограничить результат, который подается в таблицу #temp, поскольку он будет медленным для больших таблиц.