【发布时间】: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 @FoodGroup和Name LIKE @Name是使参数可选的非常低效的方法,并且当您有大量数据时会运行缓慢。 -
这是用于 SQL Server 的吗?
-
没错,就是SQL Server
-
所以没有任何内容与
where子句匹配。这似乎很容易理解。 -
你是对的,戈登。 @Name 参数我需要一个通配符。啊。谢谢。
标签: sql sql-server stored-procedures view null