2010-02-25 60 views
3

我有一個包含3個可選搜索條件的搜索UI。 其中2個是where語句的簡單標準,我應該可以用這個來解決:Stored Procedure with optional "WHERE" parametersTSQL:具有可選連接的查詢

最後一個標準是使用全文搜索,我加入ContainsTable的結果。是否有一些技巧可以將所有內容放入一個存儲過程中?或者我應該提出兩個查詢,一個是全文搜索,一個是沒有?

編輯:我應該在這裏把我的查詢,以及,對不起這是

select Table1.* from Table1 
join 
(
select [Key], SUM(Rank) as Rank from 
(
    SELECT [Key], Rank*3 as Rank FROM Table1ShortSearch(@Keywords) union all 
    SELECT [Key], Rank*2 as Rank FROM Table1LongSearch(@Keywords) 
) as RankingTbl 
group by [Key] 
) as r 
on Table1.Id = r.[Key] 

where (@Status_Id Is Null Or Status_Id = @Status_Id) 

order by r.Rank Desc 

感謝。

回答

2

原來的答案:

您可以使用EXISTS功能,像這樣:

Select .. 
From .. 
Where (@Status_Id Is Null Or Status_Id = @Status_Id) 
And (@Date Is Null Or [Date] = @Date) 
And (@Criteria Is Null Or Exists(
     Select 1 
     From ContainsTable(TableName, Column1,...,ColumnN, @Criteria..) As SearchTable1 
     Where SearchTable1.PK = OuterTable.PK 
     )) 

後問題修訂:

修改後的查詢是與原始查詢完全不同的性質。在原始查詢中,只需要返回Table1的結果,並在@Keywords不爲空的情況下過濾這些結果。在這個查詢中,您正在向SELECT子句輸出自由文本排名。如果將@Keywords作爲空值傳遞,那麼會爲排名顯示什麼?

如果不需要自由文本排名和你只是想返回的結果,如果無論是在@Keywords的搜索找到的東西,那麼你會做這樣的事情:如果你想顯示的自由文本排名

Select ... 
From Table1 
Where (@Status_Id Is Null Or Status_Id = @Status_Id) 
    And ... 
    And (
     @Keywords Is Null 
     Or Exists (
        Select 1 
        From Table1ShortSearch(@Keywords) As T1 
        Where T1.Key = Table1.Key 
        ) 
     Or Exists (   
        Select 1 
        From Table1LongSearch(@Keywords) As T2 
        Where T2.Key = Table1.Key 
        ) 
     ) 

那麼您的原始查詢或CTE可能是解決方案,但是如果您想要將@Keywords作爲空值,則需要使用左連接到子查詢。這將使您的查詢讀取:

Select ... 
From Table1 
    Left Join (
       Select [Key], Sum(Rank) as Rank 
       From (
         Select [Key], Rank*3 As Rank 
         From Table1ShortSearch(@Keywords) 
         Union All 
         Select [Key], Rank*2 As Rank 
         From Table1LongSearch(@Keywords) 
         ) As RankingTbl 
       Group By [Key] 
       ) as R 
     On R.[Key] = Table1.Id 
Where (@Status_Id Is Null Or Status_Id = @Status_Id) 
    And ... 
    And (@Keywords Is Null Or R.Key Is Not Null) 
Order By R.Rank Desc 
+0

嗨我postede我的查詢,你可以修改它並告訴我應該如何使用存在?謝謝 – Karsten 2010-02-26 08:41:20