给出以下在TSQL中的存储过程,可以传入一个逗号分隔的ID字符串,交给一个函数,该函数返回一个ID表,以便加入到该表中,如果传入的参数,是否有一个优雅的方法可以这样做。@BomAssemIDs
是NULL,这样就不是没有记录被选中,而是ALL被选中。
作为一个连接,它是过滤,但如果是 @BomAssemIDs
是空的,我不想使用它。 我是想避免使用额外的代码或动态SQL,所以现在我的解决方案是一个大的if语句,一个使用表函数join,另一个不使用它。 似乎我应该可以优雅的表达出来,但我无法把握。使用SQLServer 2012
ALTER PROCEDURE dbo.[up_BomAssem_by_BomAssemIDs]
@JobID int ,
@BomAssemIDs varchar(2000)
AS
BEGIN
SELECT ba.*
FROM BomAssem ba
JOIN dbo.uf_SplitIntIDsToTable(@BomAssemIDs) sl ON ba.BomAssemID = sl.RecID
where ba.JobID = @JobID
END
鉴于你只使用 join
筛选,我会把它移到 where
子句(过滤所属的地方),然后添加一个 OR
检验 where @BomAssemIDs is null
如果允许所有记录通过,例如
SELECT ba.*
FROM BomAssem ba
WHERE ba.JobID = @JobID
AND (
@BomAssemIDs IS NULL
OR ba.BomAssemID IN (select RecId from dbo.uf_SplitIntIDsToTable(@BomAssemIDs))
);
如果我不指出,你最好用一个 表有价参数 而不是逗号分隔的字符串。
您可以使用 or
附带 left join
:
SELECT ba.*
FROM BomAssem ba LEFT JOIN
dbo.uf_SplitIntIDsToTable(@BomAssemIDs) sl
ON ba.BomAssemID = sl.RecID OR @BomAssemIDs IS NULL
WHERE ba.JobID = @JobID;
或者直接使用 union all
:
SELECT ba.*
FROM BomAssem ba JOIN
dbo.uf_SplitIntIDsToTable(@BomAssemIDs) sl
ON ba.BomAssemID = sl.RecID
WHERE ba.JobID = @JobID
UNION ALL
SELECT ba.*
FROM BomAssem ba
WHERE @BomAssemIDs IS NULL