2012-07-25 79 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