我在下面有一个Stored Proc查询,它涉及返回部分分隔的搜索字符串。例如,通过搜索字符串'wis,k'的搜索将返回所有具有'wis'和'k'的ID的结果。我正在使用函数和交叉连接但是如果附加交叉连接的问题将阻止加载我加载此SPROC时需要的所有数据。我在想是否有条件交叉连接是可能的,这样当我的搜索字符串变量'@ReceiptNo'为空时,我将省略交叉连接并允许显示我的所有数据。请善意的建议。感谢。
我的SPROC部分:
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 :(得分: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时它会处理更少的行。