SP返回null为ZERO?

时间:2009-08-21 12:24:42

标签: sql sql-server sql-server-2005 stored-procedures

使用存储过程我有一个相当复杂的SQL语句,它返回一个COUNT值作为伪列。在许多情况下,结果将为“null”。这会导致我的应用程序出现问题,所以我想知道默认情况下是否可以从存储过程中将'null'返回为'0'?

感谢。

更新

我需要将ISNULL应用于以下语句;

    select recip_Chosen, recip_CampaignId) AS ChosenCount
    from TBL_CAMPAIGNRECIPIENTS
    WHERE recip_CampaignId =  @campaign
    group by recip_Chosen

应该是类似的东西;

    select recip_Chosen, ISNULL(count(recip_CampaignId),0) AS ChosenCount
    from TBL_CAMPAIGNRECIPIENTS
    WHERE recip_CampaignId =  @campaign
    group by recip_Chosen

但是,这仍然会在ChosenCount列中返回null。有什么想法吗?

更新

好的,所以上面的陈述是一个更大的陈述的一部分,如下所示。这是完整的存储过程,但不是表结构,因为它涉及多个表。我只需要'ChosenCount'来返回'0'而不是Null。 SP确实为TBL_CAMPAIGNS_CHARITIES中的每条记录返回1行,其中它对应于TBL_CAMPAIGNS。

CREATE PROCEDURE web.getPublicCampaignData
   (
   @campaign BIGINT
   )
AS
BEGIN

SELECT * 
FROM TBL_CAMPAIGNS C
INNER JOIN TBL_MEMBERS M
    ON C.campaign_MemberId = M.members_Id
INNER JOIN TBL_CAMPAIGNS_CHARITIES CC
    ON C.campaign_Key = CC.camchar_CampaignID
INNER JOIN TBL_CHARITIES CH
    ON CC.camchar_CharityID = CH.cha_Key
LEFT OUTER JOIN (
    select recip_Chosen, count(recip_CampaignId) as ChosenCount
    from TBL_CAMPAIGNRECIPIENTS
    WHERE recip_CampaignId =  @campaign
    group by recip_Chosen
) CRC
on CH.cha_Key = CRC.recip_Chosen
WHERE C.campaign_Key = @campaign;

END

4 个答案:

答案 0 :(得分:10)

是:

RETURN ISNULL(yourvalue, 0)

这基本上意味着什么:

  • 如果“yourvalue”(计算值或@variable的值)为NOT NULL,则返回该值

  • 如果“yourvalue”为空,则返回第二个参数(此处为“0”)而不是

我不知道你如何计算你的计数 - 我假设你将它分配给你的存储过程中的一些局部变量:

CREATE PROCEDURE dbo.DoMyCount()
RETURNS INT
AS BEGIN
   DECLARE @MyCountVariable INT

   SET @MyCountVariable = SELECT COUNT(*)......... -- whatever you do here

   RETURN ISNULL(@MyCountVariable, 0)
END

在这种情况下,您的存储过程dbo.DoMyCount将返回一个计数(但是您计算了该计数),或者“0”(零)是计数结果为NULL。

这样,您可以确保始终从存储过程中获取有效的NON-NULL INT值。

马克

更新:

存储过程清楚地说明了为什么ISNULL不起作用 - 它在LEFT OUTER JOIN中使用。如果没有数据匹配,那么LEFT OUTER JOIN内的整个select将永远不会被调用 - > ISNULL永远不会有机会完成它的工作。

您需要重新构建存储过程:

CREATE PROCEDURE web.getPublicCampaignData(@campaign BIGINT)
AS BEGIN
  SELECT
     (list of fields), ISNULL(CRC.ChosenCount, 0), .....
  FROM TBL_CAMPAIGNS C
  INNER JOIN TBL_MEMBERS M 
     ON C.campaign_MemberId = M.members_Id
  INNER JOIN TBL_CAMPAIGNS_CHARITIES CC 
     ON C.campaign_Key = CC.camchar_CampaignID
  INNER JOIN TBL_CHARITIES CH 
    ON CC.camchar_CharityID = CH.cha_Key
  LEFT OUTER JOIN (
    select recip_Chosen, count(recip_CampaignId) as ChosenCount
    from TBL_CAMPAIGNRECIPIENTS
    WHERE recip_CampaignId =  @campaign
    group by recip_Chosen
  ) CRC on CH.cha_Key = CRC.recip_Chosen
  WHERE 
     C.campaign_Key = @campaign;
END

这样,如果CH.cha_Key = CRC.recip_Chosen不匹配且LEFT OUTER JOIN返回NULL,它将被捕获并且ChosenCount = NULL将变为“0”。

答案 1 :(得分:5)

除了SQL Server上的isnull之外,我是coalesce的忠实拥护者,因为它需要任意数量的参数。对于两个参数,它在功能上等同于isnull

return coalesce(yourvalue, 0)

与:

相同
return isnull(yourvalue, 0)

然而,

coalesce(yourvalue, backupval, 0)

相当于

isnull(isnull(yourvalue, backupval), 0)

显然,coalesce在这种情况下更具可读性,所以这就是我成为粉丝的原因。

在一个非常简单的问题上为一个冗长的答案道歉,但是,嘿,为什么不学习别的东西,是吗?

答案 2 :(得分:2)

select isnull(sum(size),0) as total_size from my_table where is_valid = 1

答案 3 :(得分:2)

ISNULL可能更快,它特定于SQLServer。

COALESCE是ANSI标准

Here's some differences and other explanations about ISNULL and COALESCE