【问题标题】:Create stored procedure with parameters which it has null values使用具有空值的参数创建存储过程
【发布时间】:2017-02-21 06:26:25
【问题描述】:

我是 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 语句有问题,但我仍然很困惑。

我需要一个建议..

谢谢...

【问题讨论】:

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


    【解决方案1】:

    WHERE 子句中混合ANDOR 时需要非常小心 - 试试这个:

    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) 来进一步简化它 - 这已经由第一个库存条件处理:

    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) 
    

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 2018-09-19
      相关资源
      最近更新 更多