2011-11-29 74 views
1

我在下面有一个Stored Proc查询,它涉及返回部分分隔的搜索字符串。例如,传递'wis,k'搜索字符串的搜索将返回所有带有'wis'和'k'的ID的结果。我正在使用一个函数和一个交叉连接,但如果连接交叉连接会导致加载此SPROC时无法加载所有我需要的数据。我在考虑是否有条件的交叉连接,这样当我的搜索字符串变量'@ReceiptNo'为空时,我将省略交叉连接并允许显示所有的数据。请提供建议。谢谢。条件下交叉连接

我的存储过程的一部分:

FROM [Transact] T 
    LEFT JOIN [Outlet] O On (T.Outlet_Code = O.Code) 
    LEFT JOIN [SystemCode] SC on (CONVERT(NVARCHAR,T.Mode) = SC.Code) 
    CROSS JOIN DBO.SPLIT(@ReceiptNo , ',') --SPLIT function to seperate delimited string 
    Where 
    (
     CardNo In 
     (
      Select [CardNo] 
      FROM [Card] 
      WHERE [CardNo] = @CardNo 
      AND [DeletedBy] IS NULL 
      AND [DeletedOn] IS NULL 
      AND [MemberID] = @MemberId 
     ) 
    ) 
     and 
     (
      (T.TransactDate Between @TransactDateFrom And @TransactDateTo 
      or @TransactDateFrom is null 
      or @TransactDateTo is null 
     ) 
      and (T.TransactDate >= @TransactDateFrom 
      or @TransactDateFrom is null) 
      and (T.TransactDate <= @TransactDateTo 
      or @TransactDateTo is null)    
      and 
      (
      (',' + @Mode +',' LIKE '%,' + CONVERT(VARCHAR, T.Mode) + ',%') 
      or @Mode is null 
     ) 
     and (T.ReceiptNo LIKE '%' + VAL + '%') --This is the 'LIKE' condition to return desired search string results 
      or (@TransactDateFrom is null 
      and @TransactDateTo is null 
      and @Mode is null 
      and @Outlet_Code is null 
      and @ReceiptNo is null 
      ) 
     ) 
    Group by T.AutoID, TransactDate,TransactTime, SC.Name, O.Name 
     , ReceiptNo, AmountSpent, TransactPoints, VoidOn 
+0

您正在使用哪种RDBMS? – 2011-11-29 02:08:14

回答

1

你需要采取NULL的照顾和将其设置为任意恒定值。修改CROSS JOIN至(阅读下面查询注释):

CROSS JOIN (SELECT ISNULL(Portion, 1) AS Portion FROM DBO.SPLIT(@ReceiptNo , ',')) TTT 

在上面的查询,Portion被列由DBO.SPLIT函数返回。如果需要,将其名称更改为适当并添加更多列(使用ISNULL)。

我错过了什么或者您可以简单地使用LEFT JOIN而不是CROSS JOIN?此外,您可能会考虑将DBO.SPLIT函数结果放入临时表中,将其索引,然后在CROSS/LEFT JOIN中使用它。

编辑#1:我找不到任何理由你不应该将CROSS JOIN更改为LEFT JOIN,因为当@RecepitNo不为NULL时它将处理更少的行。

+0

我只想用'LEFT JOIN'去。 –