接受多个id值的存储过程(其中parameter接受null)

时间:2012-07-09 19:21:31

标签: sql-server tsql stored-procedures

这个问题将成为T-SQL stored procedure that accepts multiple Id values

中最后一个答案的附录

我将一些id列表作为参数传递给存储过程。如果没有数据发送,则每个默认为null。例如,我想要通过我的存储过程返回的带有ID 1,2,5,7,20的食品。我还发送了一个颜色ID列表和生产位置ID。我正在传递这些ID的逗号分隔列表。与上面引用的问题中的最后一个答案类似,我使用每个参数的数据创建临时表。然后我想要一个类似这样的select语句:

SELECT * FROM Candies 
INNER JOIN #TempColors 
    ON Candies.ColorsID = #TempColors.ColorID 
INNER JOIN Locations 
    ON Candies.LocationID = Locations.LocationID

仅在填充参数且LEFT OUTER JOINS无法正确过滤时才有效。接受null作为有效参数时过滤的方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用

some join condition OR @param IS NULL

在你的连接中,如果提供了null,它将返回所有结果 - 尽管我可以看到你没有指定传递null时你想要的行为

(当我说param时,我的意思是临时表栏在我的手机上这样做,这并不容易;)

编辑:

这个对我有用:

http://sqlfiddle.com/#!3/c7e85/26

e.g。

-- Assume this is your values string which is populating the table
DECLARE @Values varchar(50)

-- Your code to populate the table here: assume the string is NULL when no values are passed
INSERT INTO #TempColors BLAH BLAH...

-- Select statement
SELECT * FROM Candies  
    LEFT JOIN #TempColors  
        ON Candies.ColorsID = #TempColors.ColorID
WHERE 1 = CASE 
              WHEN Candies.ColorsID IS NULL AND @Values IS NULL THEN 1
              WHEN Candies.ColorsID IS NOT NULL AND @Values IS NOT NULL THEN 1
              ELSE 0
          END

这样就可以使用NON-NULL参数过滤掉NULL,但保留NULL参数