SP返回null为ZERO?

Mun*_*ish 3 sql sql-server stored-procedures sql-server-2005

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

谢谢.

UPDATE

我需要将ISNULL应用于以下声明;

    select recip_Chosen, recip_CampaignId) AS ChosenCount
    from TBL_CAMPAIGNRECIPIENTS
    WHERE recip_CampaignId =  @campaign
    group by recip_Chosen
Run Code Online (Sandbox Code Playgroud)

这应该是什么样的;

    select recip_Chosen, ISNULL(count(recip_CampaignId),0) AS ChosenCount
    from TBL_CAMPAIGNRECIPIENTS
    WHERE recip_CampaignId =  @campaign
    group by recip_Chosen
Run Code Online (Sandbox Code Playgroud)

但是,这仍然会在ChosenCount列中返回null.有任何想法吗?

UPDATE

好的,所以上面的陈述是更大的陈述的一部分,如下所示.这是完整的存储过程,但不是表结构,因为它涉及多个表.我只需要'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
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 11

是:

RETURN ISNULL(yourvalue, 0)
Run Code Online (Sandbox Code Playgroud)

这基本上意味着什么:

  • 如果"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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的存储过程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
Run Code Online (Sandbox Code Playgroud)

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

  • 最好的选择,ISNULL比COALESCE更快(这是最后的情况,大多数人都不知道) (3认同)

Eri*_*ric 5

除了isnull在SQL Server上,我是一个狂热的粉丝coalesce,因为它需要任意数量的参数.对于两个参数,它在功能上等同于isnull:

return coalesce(yourvalue, 0)
Run Code Online (Sandbox Code Playgroud)

是相同的:

return isnull(yourvalue, 0)
Run Code Online (Sandbox Code Playgroud)

然而,

coalesce(yourvalue, backupval, 0)

相当于

isnull(isnull(yourvalue, backupval), 0)

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

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