【发布时间】:2015-10-08 14:34:27
【问题描述】:
简短版本:无论将什么 UnitRateID 传递给函数并存储在 @UnitRateID 中,SET @UnitRate 始终设置为相同的值
长版本:当我的函数以不同的@UnitRateID 传递时,我在将@UnitRate 设置为不同的值时遇到问题。似乎无论传入什么@UnitRateID,我总是会从我正在将@UnitRate 设置为的 SELECT 语句返回的 UnitRate 作为 UnitRateID 的值 11。
我相信我正确地传递了不同的值,因为我用于创建预订的存储过程将正确地使用不同的 UnitRateID 填充我的表
我还应该注意,如果我使用 SELECT 语句并在 @UnitRate 的设置之外运行它并手动将 WHERE ur.UnitRateID = @UnitRateID 设置为 WHERE ur.UnitRateID = n 其中 n 是我的 UnitRateID 我会得到不同返回值。有一个注释掉的部分,我在其中测试是否存在由于我的其他计算住宿税率的函数而导致的问题,我发现当我将 @deposit 设置为 @UnitRate 时,该错误确实在此函数中,因为无论传入 UnitRateID,我都会获得相同的存款值(@UnitRate 的存款值)。
我的 SETing 语法是否正确?我如何设置它以使其始终获取并返回 UnitRateID 为 11 的值会有什么问题吗?
我无法分享数据库架构本身的细节,但如果需要更多信息来剖析问题,请告诉我!
代码:我的存款计算函数...
CREATE FUNCTION dbo.CalculateDeposit
(
@UnitRateID smallint,
@ResCheckInDate date
)
RETURNS smallmoney
AS
BEGIN
DECLARE @deposit smallmoney
DECLARE @PropertyID smallint
DECLARE @UnitRate smallmoney
SET @deposit = 0
SET @UnitRate = (
SELECT ur.UnitRate
FROM UnitRate as ur
WHERE ur.UnitRateID = @UnitRateID
)
SET @PropertyID = (
SELECT p.PropertyID
FROM Property as p
JOIN UnitRate as ur
ON ur.PropertyID = p.PropertyID
AND ur.UnitRateID = @UnitRateID
)
SET @deposit = ROUND((@UnitRate + (@UnitRate * (0.01 *(SELECT (dbo.GetLodgingTaxRate(@PropertyID, @ResCheckInDate)))))), 2);
--The below commented out section is for testing
--SET @deposit = @UnitRate
RETURN @deposit
END
GO
示例调用:
SET @deposit = dbo.CalculateDeposit(@UnitRateID, 'YYYY-MM-DD')
然后我将那个存款值传递到一个存储过程中。并不是说这里的@UnitRateID 和@deposit 不在我展示的函数中,因此不在同一范围内。 @UnitRateID 实际上是一个硬编码值,当我通常调用它并将@deposit 传递到我的存储过程中时。
编辑:
请求的属性和单价表数据:http://gyazo.com/3f399914bd889c52e4cc85be97fcc2e6
问题可能不是代码??:
我在这里发帖是假设在检查了相当多的数据和其他代码之后,我的代码和语法存在一些问题。我根据注释掉的 SET @deposit = @UnitRate 测试将它隔离到发布的函数中......似乎错误可能不是语法,而是我的数据和/或表本身?大家觉得呢?
【问题讨论】:
-
能否提供
Property和UnitRate表中的数据样本? -
gyazo 链接好吗?
-
您可以在存储过程中添加
print语句来帮助您调试它。例如print '@UnitRateID = ' + cast(@UnitRateID as varchar(32)。 -
我最初是通过 SELECTing 我的 sproc 的结果来进行的,但是在插入之前添加打印(因此在 sproc 调用期间传入的原始数据)显示就我的 sproc 而言担心,我确实在正确传递不同的 UnitRateID(由 sproc @UnitRateID 变量捕获)。
标签: sql-server function tsql stored-procedures set