2012-07-25 113 views
1

我正在使用存儲過程來獲取某個案例的帳戶。如果@accounts參數是NULL,我想獲取該案例的所有帳戶。如果@accountsNOT NULL,那麼它將是以逗號分隔的accountid字符串。我想有一個可以處理這個問題的where子句。某些說如果@accountsNULL然後抓住案件的所有帳戶。否則,請使用@accounts參數並使用指定的帳戶ID獲取帳戶。我想避免一個大的IF聲明,這將要求我使用兩個不同的WHERE子句進行兩次查詢。SQL WHERE子句需要動態化

DECLARE @caseId BIGINT, 
    DECLARE @accounts VARCHAR(255) 

    SELECT TOP 1 @userId = userId FROM TblTraceCur t 
    WHERE caseId = @caseid 
    ORDER BY processDate DESC 

    SELECT  
       .... (select logic) ... 
    WHERE  
       t.caseId = @caseID AND 
       t.userId = @userId AND 
       t.shortStock = 0 AND 
       ... (where I need the new logic) ... 
    order by t.tracln ASC 

非常感謝!

+1

你會更好的使用臨時表和[Split()函數](http://stackoverflow.com/questions/697519/split-function-equivalent-in-tsql),因爲你將允許查詢優化器使用索引從而提高速度。 – 2012-07-26 07:13:27

回答

3

這對我有效。添加(@accounts IS NULL OR @accounts LIKE ('%,' + CAST(t.caseId AS VARCHAR(255)) + ',%'))您在帖子中指出的地方。當然,你必須確保你的@accounts中的第一個字符和最後一個字符是逗號,這是工作的,但這是我認爲的最簡單的方法。例如,沒有逗號就會返回ids錯誤:讓@accounts = 12會返回ids 1,2和12.使用逗號並確保它們是第一個也是最後一個字符,防止發生這種情況。

+0

這將是我的回答 – 2012-07-25 23:05:05

+0

感謝@Aust這個貼子。當我明天回去工作時,我會嘗試一下。 – 2012-07-26 00:00:54

+0

非常適合我。謝謝! – 2012-07-26 18:12:46