【发布时间】:2016-06-28 07:53:27
【问题描述】:
真的很傻,但我正在尝试编写一个 SQL Server 脚本,该脚本创建一个存储过程,将酒店房间的 RackRate 降低 6.66%。当我去执行存储过程时,我不断收到以下错误:
必须声明标量变量“@NewRackRate”。
任何帮助将不胜感激。
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_NAME = 'sp_UpdateRackRate')
DROP PROCEDURE sp_UpdateRackRate;
GO
CREATE PROC sp_UpdateRackRate
@RackRate smallmoney
AS
BEGIN
DECLARE @NewRackRate smallmoney;
DECLARE @OldRackRate smallmoney = (SELECT RackRate FROM RackRateTable);
UPDATE RackRateTable
SET @NewRackRate = @OldRackRate - (@OldRackRate * .0666)
END
GO
EXEC sp_UpdateRackRate
@RackRate = @NewRackRate; // How do I access @NewRackRate?
【问题讨论】:
-
除非我有误解,否则您希望 @NewRackRate 成为存储过程中的 OUTPUT 参数。
-
@NewRackRate 在 BEGIN 之后声明,并在到达相应的 END 时超出范围。您只能在其范围内使用它。一个 END 到达,它不再存在,你不能在 EXEC 调用中使用它。
-
@KenWhite,我就是这么想的。如何全局声明?
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
您的程序根本没有意义。首先,除非
RackRateTable仅包含一行,否则您的第二个声明应返回错误。其次,您的更新语句正在设置一个变量而不是列,第三,您的参数可能应该被声明为输出参数,正如 ZLK 所写的那样。
标签: sql-server