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

时间:2014-06-17 10:53:59

标签: c# sql sql-server stored-procedures web-applications

我在理解以下存储过程时遇到了一些麻烦。

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'。

2 个答案:

答案 0 :(得分:1)

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

然后,如果你有isnull(Approved, 0),那就说Approved是否为NULL然后返回值0(FALSE)而不是NULL。

Approved可以是TRUEFALSE,将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)