使用具有空值的参数创建存储过程

时间:2016-10-12 12:38:08

标签: sql-server stored-procedures parameter-passing

我是SQL Server的新手。

我有一个表dbo.Example,它有4列,如下所示:

|Barcode|Goods |  Stock   |   Person |
-----------------------------------------
|0020307|Book  |Available |   Mike   |
|0090010|Table |NULL      |   Jane   |
|0140397|Chalk |NULL      |   Mike   |
|0190017|Glass |NULL      |Christoper|
|0080017|Hammer|Available |   Ron    |

我尝试使用参数创建一个存储过程,该参数在[Stock]列中具有空值。

CREATE PROCEDURE examproc
    @person NVARCHAR(50) = NULL,
    @stock nvarchar(50) = NULL 
AS
    SELECT * 
    FROM dbo.Example
    WHERE person = ISNULL(@person, person)
      AND Stock = ISNULL(@stock, Stock) OR Stock IS NULL

使用参数:

执行这样的过程
EXEC examproc @person = 'Mike'

但结果并非我的预期:

|Barcode|Goods |  Stock   |   Person |
-----------------------------------------
|0020307|Book  |Available |   Mike   |
|0090010|Table |NULL      |   Jane   |
|0140397|Chalk |NULL      |   Mike   |
|0190017|Glass |NULL      |Christoper|

我知道我的SQL语句有问题,我仍然感到困惑。

我需要一个建议..

...谢谢

1 个答案:

答案 0 :(得分:2)

Modelica.Fluid.Examples.DrumBoiler.BaseClasses.EquilibriumDrumBoiler条款中混合ANDOR时,您需要格外小心 - 试试这个:

WHERE

你可以通过省略第二个条件(CREATE PROCEDURE examproc @person NVARCHAR(50) = NULL, @stock nvarchar(50) = NULL AS SELECT * FROM dbo.Example WHERE person = ISNULL(@person, person) AND (Stock = ISNULL(@stock, Stock) OR Stock IS NULL) )来进一步简化它 - 这已经由第一个库存条件处理:

Stock IS NULL