Да
RETURN ISNULL(yourvalue, 0)
Что это в основном означает:
, если "yourvalue" (или вычисленное значение, или значение @variable) не равно NULL, тогда вернуть это значение
если значение "yourvalue" равно NULL, вместо этого вернуть второй параметр (здесь "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 никогда не будет вызван -> 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».