我在理解以下存储过程时遇到了一些麻烦。
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)
当我查看专栏'已批准'在数据库中,它的值为' null',0和1.这些值表示为位变量。为什么要批准'在过程中声明为bit = null,isnull(Approved, 0)
是什么意思?基本上我试图改变这个程序来调用所有行' Approved'具有值' null'。
答案 0 :(得分:1)
在SQL中看到@SomeName
的地方,它是一个变量。所以@Approved bit = null
正在创建一个变量并将其值设置为NULL(只是初始化为某个默认值)。我猜这个变量然后在其他点设置为TRUE / FALSE或NULL。这段代码没有显示在你的代码段中,所以假设你在第一个......
部分。
然后,如果你有isnull(Approved, 0)
,那就说Approved
是否为NULL然后返回值0(FALSE)而不是NULL。
Approved
可以是TRUE
或FALSE
,将NULL
视为FALSE
。
这样就会问为什么允许它在数据库中可以为空,但这可能超出了这个问题的范围。
答案 1 :(得分:0)
为什么'Approved'声明为bit = null
这是参数的默认值。如果在没有该参数的情况下调用该过程,则它将使用默认值。
isnull(Approved,0)是什么意思?
这表示已选择Approved
字段的值,如果该值为null
,则会返回值0
。
我正在尝试更改此proc以使用列调用所有行 '已批准',其值为'null'
为此你可以在查询中添加这样的条件:
where Approved is null
如果您想使用@Approved
参数进行比较,并允许null
值从表中获取所有null
值,那么您可以使用:
where (@Approved is null and Approved is null) or (Approved = @Approved)