【发布时间】:2011-04-19 08:09:25
【问题描述】:
我有以下存储过程,它接受用户 ID、开始日期、结束日期和逗号分隔列表中的代码列表,并返回这两个日期之间与其中一个匹配的所有活动记录列表中的代码。
ALTER PROCEDURE [dbo].[ActivitiesSummary]
@UserID varchar(30),
@StartDate datetime,
@EndDate datetime,
@Codes varchar(100)
AS
BEGIN
SET NOCOUNT ON;
SELECT act.SectionID, act.UnitID, act.ActivityCode
FROM dbo.Activities act INNER JOIN ConvertCodeListToTbl(@Codes) i ON act.ActivityCode = i.code
WHERE act.ActivityDate>=@Startdate AND act.ActivityDate<@EndDate
GROUP BY act.SectionID, act.UnitID, act.ActivityCode
ORDER BY act.SectionID, act.UnitID, act.ActivityCode
END
ConvertCodeListToTbl(@Codes) 是一个函数,它采用逗号分隔的代码列表(例如,'A0001, B0001, C0001')并返回每行一个代码的表:
A0001
B0001
C0001
此方法非常有效,除非未选择任何代码。发生这种情况时,我没有收到任何记录,因为 @Codes='' 并且最后一个 INNER JOIN 没有返回任何记录。
我想要发生的事情:如果 @Codes='',忽略最后一个 INNER JOIN,或者找到一种方法来返回所有记录而不管代码。
我有什么选择?
【问题讨论】:
-
我之前设法避免使用动态 SQL,因为它存在所有相关的安全问题,所以如果可能的话,我想继续这样做。
标签: sql sql-server-2005 stored-procedures