在SQL查询中使用COALESCE的NullReferenceException

时间:2018-04-09 15:42:24

标签: c# sql-server

也许我误解了COALESCE,但实际上,我想要做的是运行一个select查询,如果它返回NULL而不是int,则为了ExecuteScalar()而返回0。

SQL Server查询:

SELECT TOP 1 COALESCE(SeqNo,0) 
FROM tblProjectChangeOrder 
WHERE ProjectID = XXXXX 
ORDER BY SeqNo DESC

如果提供的ProjectID存在于Change Order表中,它将返回预期的最高SeqNo。但是,如果提供的ProjectID没有现有的Change Orders(因此为SeqNo返回NULL),而不是COALESCE返回0,我仍然是NULL。

我只是弄错了语法或者我想用COALESCE做什么?我看到的另一个选项是让我的ExecuteScalar()传递给一个可以为空的int,然后用一个??在我的C#代码隐藏中合并。

3 个答案:

答案 0 :(得分:5)

正如约翰在评论中提到的那样,COALESCE在行级运行。如果表中不包含任何行,或者语句不返回任何行,则不会返回任何行。举一个简单的例子:

CREATE TABLE #Sample (ID int);

SELECT COALESCE(ID, 0)
FROM #Sample;

DROP TABLE #Sample;

请注意,不会返回任何内容。

相反,一种方法是使用子查询。对于您的查询,这将导致:

SELECT COALESCE(SELECT TOP 1 SeqNo 
                FROM tblProjectChangeOrder 
                WHERE ProjectID = XXXXX 
                ORDER BY SeqNo DESC),0) AS SeqNo;

这也假设 Seqno的数据类型为int;否则你很可能会收到转换错误。

答案 1 :(得分:0)

我的猜测是代码中出现null引用异常,与sql查询无关。可能只是你的代码没有处理你没有返回任何行(或者你的情况下没有标量),但是你可能试图在c#中的某个地方访问它。

向我们展示在c#中抛出此异常的代码行,以便我们可以确认这一点。

问候

修改:来自this similar topic

在您的c#代码中,您可能想尝试(" cmd"作为您的" SqlCommand"对象):

int.TryParse(cmd.ExecuteScalar(), out int result);

或一行

function loadStaffPic(staffName) {
  
  /* Code to use staffName to retrieve loginID from 
     SharePoint OM goes here and returns the variable loginID */

  var filename = loginID.replace("\\","_");
  var picURL = "http://www.mywebsite.com/images/" + filename + ".png";
  
  document.getElementById("StaffPic").src = picURL;
}

我不知道它是否适合您,但我希望它是一个开始。

答案 2 :(得分:0)

由于覆盖null并且没有行不相同。
这个样本涵盖了它。

set nocount on;
select isnull(1, 0) 
where 1 = 1;
select isnull(1, 0) 
where 1 = 2;
select isnull(null, 0) 
where 1 = 1;
select isnull(null, 0) 
where 1 = 2;

-----------
1


-----------


-----------
0


-----------

这应该有效

select top 1 isnull(seq, 0) 
from (select null as seq 
      union all   
      select max(seq) from tblProjectChangeOrder where ProjectID = XXXXX 
     ) tt
order by seq desc