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

SQL连接到从逗号分隔参数返回表的函数。如果参数为null,则连接到所有,sql,sql-server,join,conditional-statements,delimiter-separated-values,Sql,Sql Server,Join,Conditional Statements,Delimiter Separated Values,如果TSQL中的以下存储过程可以以逗号分隔的ID字符串形式传递给返回要加入的ID表的函数,那么如果传入的参数@BomAssemIDs为空,则会选择所有记录,而不是不选择任何记录,那么是否有一种优雅的方法来实现这一点 作为连接,它正在过滤,但是如果@BomAssemIDs为空,我就不想使用它。我试图避免额外的代码或动态SQL,所以现在我的解决方案是一个大的if语句,一个使用表函数join,另一个不使用它。似乎我应该能够优雅地表达这一点,但我无法理解。使用SQLServer2012 ALTER PR

如果TSQL中的以下存储过程可以以逗号分隔的ID字符串形式传递给返回要加入的ID表的函数,那么如果传入的参数
@BomAssemIDs
为空,则会选择所有记录,而不是不选择任何记录,那么是否有一种优雅的方法来实现这一点

作为连接,它正在过滤,但是如果
@BomAssemIDs
为空,我就不想使用它。我试图避免额外的代码或动态SQL,所以现在我的解决方案是一个大的if语句,一个使用表函数join,另一个不使用它。似乎我应该能够优雅地表达这一点,但我无法理解。使用SQLServer2012

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

您可以将
左连接一起使用

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;
或者只需使用
联合所有

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

您可以将
左连接一起使用

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;
或者只需使用
联合所有

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

如果您只使用
连接
进行筛选,我会将其移动到
where
子句(筛选所属的位置),然后添加一个
来测试
其中@BomAssemIDs为空
,如果是,则允许所有记录通过例如

SELECT ba.* 
FROM BomAssem ba
WHERE ba.JobID = @JobID
AND (
  @BomAssemIDs IS NULL
  OR ba.BomAssemID IN (select RecId from dbo.uf_SplitIntIDsToTable(@BomAssemIDs))
);

如果我没有指出您最好使用逗号分隔的字符串而不是逗号分隔的字符串来传递列表,那我就是失职了。

如果您只使用
join
进行筛选,我会将其移动到
where
子句(筛选所属的位置)然后添加一个
来测试
,其中@BomAssemIDs为空
,如果是,则允许通过

SELECT ba.* 
FROM BomAssem ba
WHERE ba.JobID = @JobID
AND (
  @BomAssemIDs IS NULL
  OR ba.BomAssemID IN (select RecId from dbo.uf_SplitIntIDsToTable(@BomAssemIDs))
);

如果我没有指出您最好使用逗号而不是逗号分隔的字符串来传递列表,那我就太失职了。

Doh!是的,我全神贯注于加入,很明显我逃脱了。我想因为我的观点不多,我没有投票权?但这是可行的。呃……或者我点击复选图标……双重Doh。教育……就像魔术一样!我也将检查表参数…谢谢。Doh!是的,我全神贯注于加入,很明显我逃脱了。我想因为我的观点不多,我没有投票权?但这是可行的。呃……或者我点击复选图标……双重Doh。教育……就像魔术一样!我也会检查表参数…谢谢。当@BomAssemID为Null时,不会返回任何记录,而不是我要找的记录。当@BomAssemID为Null时,不会返回任何记录,而不是我要找的记录。