首页 > 解决方案 > SQL 连接到从逗号分隔参数返回表的函数。如果参数为空加入所有

问题描述

鉴于 TSQL 中的以下存储过程可以以逗号分隔的 ID 字符串形式传递,该字符串提供给返回用于连接的 ID 表的函数,如果传入的参数 , 是否有一种优雅的方法来执行此@BomAssemIDs操作为 NULL,这样就不会选择任何记录,而是选择 ALL。

作为一个连接,它正在过滤,但如果@BomAssemIDs是 null 我不想使用它。我试图避免额外的代码或动态 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

标签: sqlsql-serverjoinconditional-statementscsv

解决方案


您可以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

推荐阅读