我有一個SQL查詢,需要這些參數:如何使用大型複雜where子句構建查詢?
@SearchFor nvarchar(200) = null
,@SearchInLat Decimal(18,15) = null
,@SearchInLng Decimal(18,15) = null
,@SearchActivity int = null
,@SearchOffers bit = null
,@StartRow int
,@EndRow int
變量@SearchFor
,@SearchActivity
,@SearchOffers
可以爲空或不爲空。 @SearchInLat
和@SearchInLng
必須都爲空,或兩者都有值。
我沒有要發佈整個查詢作爲它的枯燥,難以閱讀,但在WHERE子句的形狀像這樣:
(-- filter by activity --
(@SearchActivity IS NULL)
OR (@SearchActivity = Activities.ActivityID)
)
AND (-- filter by Location --
(@SearchInLat is NULL AND @SearchInLng is NULL)
OR (...)
)
AND (-- filter by activity --
@SearchActivity is NULL
OR (...)
)
AND (-- filter by has offers --
@SearchOffers is NULL
OR (...)
)
AND (
... -- more stuff
)
我已閱讀,這是一個糟糕的方式來構建一個查詢 - SqlServer無法制定出一個有效的執行計劃,並有很多這樣的子句,所以我正在尋找其他方法來實現它。
我看到這樣的方法有兩種:
- 構造查詢在我的客戶端應用程序的字符串,使
WHERE
子句只包含了相關參數的過濾器。與此相關的問題是,這意味着無法通過存儲過程訪問數據庫,因爲現在的其他一切都是如此。 - 更改存儲過程,以便它檢查哪些參數爲空,並根據傳遞的參數執行子過程。這裏的問題是,這意味着在過程的定義中重複我自己,因此更難以維護。
我該怎麼辦?還是應該繼續保持現狀?我爲程序設置了OPTION (RECOMPILE)
,但我聽說這在Server 2005中不起作用。另外,我打算爲此proc添加更多參數,因此我想確保我擁有的任何解決方案都是可擴展的。
**不成熟的優化是所有邪惡的根源**您是否嘗試過當前查詢?它工作速度夠快嗎? – JNK 2012-01-30 16:00:22
您也可以在字符串中構建查詢,只在需要時添加到WHERE子句,然後執行該字符串。你可能仍然有這樣的執行計劃的問題 – msmucker0527 2012-01-30 16:00:42
@Jnk它已經超級慢,但我遇到了很多麻煩修復。我不想讓它變得更慢,因爲我添加了更多的參數。 – Oliver 2012-01-30 16:01:17