也许我误解了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#代码隐藏中合并。
答案 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