【问题标题】:Cannot get rid of the "procedure attempted to return a status of NULL" error无法摆脱“程序试图返回 NULL 状态”错误
【发布时间】:2016-09-07 06:27:49
【问题描述】:

我正在尝试从存储过程中获取值。

USE FoodDB
GO

IF OBJECT_ID('spCalCount') IS NOT NULL
DROP PROC spCalCount
GO

CREATE PROC spCalCount
    @FoodGroup varchar(25) = '%',
    @Name varchar(25) = '%'
AS

DECLARE @NumCalories decimal(4,1) 

SET @NumCalories = (SELECT SUM(MealCalories)
                    FROM CalsPerMeal
                    WHERE FoodGroup LIKE @FoodGroup 
                    AND Name LIKE @Name)

RETURN @NumCalories

CalsPerMeal 是一个组合了几个表的视图。这是我能想到的唯一导致错误的事情。

USE FoodDB

DECLARE @Count decimal(4,1)
EXEC @Count = spCalCount 'Fruit', 'Jason'
PRINT 'Jason has eaten ' + CONVERT(varchar,@Count,1) + ' Fruit Calories'

我不断收到的错误是:

The 'spCalCount' procedure attempted to return a status of NULL, which is
not allowed. A status of 0 will be returned instead.
Jason has eaten 0.0 Fruit Calories

我也用输出参数尝试了这种变化,但仍然得到 NULL

USE FoodDB
GO

IF OBJECT_ID('spCalCount') IS NOT NULL
DROP PROC spCalCount
GO

CREATE PROC spCalCount
    @NumCalories decimal(4,1) OUTPUT,
    @FoodGroup varchar(25) = '%',
    @Name varchar(50) = '%'
AS
SELECT @NumCalories = (SELECT SUM(MealCalories)
                FROM CalsPerMeal
                WHERE FoodGroup LIKE @FoodGroup 
                AND Name LIKE @Name)

以及执行:

USE FoodDB

DECLARE @Count decimal(4,1)
EXEC spCalCount @Count OUTPUT, 'Fruit', 'Jason'
SELECT @Count AS JasonFruitCals

这不会给我错误,但它仍然返回 NULL

【问题讨论】:

  • 仅供参考,您的FoodGroup LIKE @FoodGroupName LIKE @Name 是使参数可选的非常低效的方法,并且当您有大量数据时会运行缓慢。
  • 这是用于 SQL Server 的吗?
  • 没错,就是SQL Server
  • 所以没有任何内容与 where 子句匹配。这似乎很容易理解。
  • 你是对的,戈登。 @Name 参数我需要一个通配符。啊。谢谢。

标签: sql sql-server stored-procedures view null


【解决方案1】:

您需要将 RETURN 包装在 ISNULL 中

RETURN ISNULL(@NumCalories,0)

SQL Server 需要一个整数,而 NULL 不是整数值。

【讨论】:

    【解决方案2】:

    您的代码看起来像 SQL Server,因此 RETURN 值必须是非 NULL INT。它警告您它正在​​将 NULL 更改为零。

    您的查询:

    SET @NumCalories = (SELECT SUM(MealCalories)
                        FROM CalsPerMeal
                        WHERE FoodGroup LIKE @FoodGroup 
                        AND Name LIKE @Name)
    

    必须导致@NumCalories 带 NULL,因此没有行到 SUM(),因此 SQL Server 将您的 NULL 返回转换为零。

    最好只通过RETURN 返回一个执行状态值,例如 0=good、-1=warning、1=fatal error 等。如果您需要传回单个值,就像您在这里所做的那样,使用 OUTPUT 参数。你只能RETURN一个int,所以如果你想要小数,你需要使用一个输出参数。输出参数可以是任何类型,因此它是您十进制值的不错选择。

    看到这个:https://stackoverflow.com/a/2881863/65223

    【讨论】:

    • 我尝试了另一种带有输出参数的变体。我编辑了我的帖子以显示它。还是不行。
    • 您的查询没有找到任何行,运行这个,返回什么? SELECT * FROM CalsPerMeal WHERE FoodGroup LIKE 'Fruit' AND Name LIKE 'Jason' 仅在未传入参数时才添加通配符。您是否尝试运行此:SELECT * FROM CalsPerMeal WHERE FoodGroup LIKE '%Fruit%' AND Name LIKE '%Jason%' 或其他什么???
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多