使用位变量调用列的存储过程

本文关键字:存储过程 调用 变量 | 更新日期: 2023-09-27 18:08:52

我在理解下面的存储过程时遇到了一点麻烦。

create procedure "abc.PersonReports"
    @PersonId int,
    @Approved bit = null
    ... 
    select 
       ID 'Id',
       StaffID 'Id',
       isnull(Approved, 0) 'Approved',
    ...

我使用下面的方法来调用这个过程:

PersonReports = this.personService.GetPersonReports(id, personId, Approved = false)

当我查看数据库中的列'Approved'时,它的值为'null', 0和1。这些被声明为位变量。为什么"Approved"在程序中被声明为bit = null, isnull(Approved, 0)是什么意思?基本上,我试图改变这个过程,以调用列'批准'具有值'null'的所有行。

使用位变量调用列的存储过程

您在SQL中看到的@SomeName是一个变量。所以@Approved bit = null正在创建一个变量并将其值设置为NULL(只是初始化为一些默认值)。我猜变量然后在其他点设置为TRUE/FALSE或NULL。这段代码没有显示在您的代码片段中,因此假设在第一个......部分中您有。

然后,在你有isnull(Approved, 0)的地方,它说如果Approved是NULL,那么返回值0 (FALSE)而不是NULL。

这个想法是Approved可以是TRUEFALSE,并将NULL视为FALSE

这就引出了一个问题,那么为什么允许它在数据库中为空,但这可能超出了这个问题的范围。

为什么'Approved'表示为bit = null

是该参数的默认值。如果在不带该参数的情况下调用过程,它将使用默认值。

isnull(Approved, 0)是什么意思?

表示选择Approved字段的值,如果该值为null,则返回0的值。

我试图改变这个过程调用所有行与列"已批准"的值为"null"

您可以在查询中添加如下条件:

where Approved is null

如果您想使用@Approved参数进行比较,并允许null值从表中获得所有null值,那么您将使用:

where (@Approved is null and Approved is null) or (Approved = @Approved)