SQL连接到函数,从逗号分隔的参数返回表。如果参数为空 Join到所有

问题描述 投票:0回答:1

给出以下在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
sql sql-server join conditional-statements delimiter-separated-values
1个回答
0
投票

鉴于你只使用 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))
);

如果我不指出,你最好用一个 表有价参数 而不是逗号分隔的字符串。


0
投票

您可以使用 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
© www.soinside.com 2019 - 2024. All rights reserved.