空またはnull値を検索すると、何が得られると思いますか?クエリが何も返さないことを期待しますか、それとも何か他のものを返すことを期待しますか。
何も返さないようにしたい場合は、次のようなことを行うのが最善です。
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
編集:nullまたは空の文字列が指定されたときにすべてのレコードを返すように修正されました。
異なる検索文字列を持つCONTAINSテーブルクエリが2つ以上ある場合は、ほぼ同じクエリの2 ^ nチェーンよりも保守がはるかに簡単であるため、動的SQLを使用してクエリを生成することをお勧めします。
編集:次のような一時テーブルを使用して、複数のコピーを使用せずにこれを行う方法を検討しました:
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テーブルに送られる結果をもう少し制限することをお勧めします。