SHORT VERSION :无论将UnitRateID传递给函数并存储在@UnitRateID
中,SET @UnitRate始终设置为相同的值LONG VERSION :当我的函数在不同的@ UnitRateID中传递时,我遇到了将@UnitRate设置为其他值的问题。似乎无论传递什么@UnitRateID,我总是会从我的SELECT语句返回UnitRate,我将@UnitRate设置为UnitRateID为11的值。
我相信我正确地传递了一个不同的值,因为我创建一个预留的sproc将使用不同的UnitRateID正确填充我的表
另外我应该注意,如果我接受SELECT语句并在@UnitRate的SETing之外运行它并手动将WHERE ur.UnitRateID = @UnitRateID设置为WHERE ur.UnitRateID = n其中n是我的UnitRateID我会得到不同返回值。有一个注释掉的部分,我测试是否有问题,因为我的其他功能计算住宿税率,我发现当我将@deposit设置为@UnitRate时,该bug确实在这个函数中,因为无论在UnitRateID中传递,我都获得相同的存款价值(@UnitRate的存款价值)。
我的SETing语法在这里是否正确?如果我设置它以使它总是抓住并返回值为11,UnitRateID为11,会有什么问题吗?
我无法分享数据库架构本身的细节,但如果需要更多信息来剖析问题,请告诉我们!
CODE :我计算存款的功能......
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')
然后我拿下那个存款值并将其传递给一个sproc。并不是说@UnitRateID和@deposit不在我展示的函数中,因此不在同一范围内。 @UnitRateID实际上是一个硬编码值,当我通常调用它并将@deposit传递给我的sproc时。
EDITS :
请求的属性和UnitRate表数据:Module::CAPIMaker
问题可能不是代码?? :
我在这里发布了一个假设,在检查了相当多的数据和其他代码后,我的代码和语法有些问题。我根据注释掉的SET @deposit = @UnitRate测试将它隔离到已发布的函数...似乎错误可能不是语法而是我的数据和/或表本身?你们觉得怎么样?
答案 0 :(得分:1)
返回@UnitRate
值的select似乎没问题。
不容易理解为什么函数中的SET @UnitRate
总是返回与UnitRateID = 11
相关联的值,而只返回那些提供的元素。
很遗憾,您无法在PRINT
(here stackoverflow中的帖子)中使用函数内的TSQL
语句。
您可以尝试另一种方法:修改函数并返回@UnitRate
的值,并尝试了解问题是否在函数内。
这是一个例子(我尽可能地尝试使其符合提供的架构和数据):
IF OBJECT_ID(N'dbo.UnitRate', N'U') IS NOT NULL
DROP TABLE dbo.UnitRate;
CREATE TABLE dbo.UnitRate (
UnitRateID SMALLINT PRIMARY KEY
, UnitRate SMALLMONEY
, PropertyID SMALLINT
);
INSERT INTO dbo.UnitRate VALUES
(11, 300, 22000)
, (12, 350, 23450);
GO
IF OBJECT_ID(N'dbo.CalculateDeposit', N'FN') IS NOT NULL
DROP FUNCTION dbo.CalculateDeposit;
GO
CREATE FUNCTION dbo.CalculateDeposit
(
@UnitRateID smallint
)
RETURNS smallmoney
AS
BEGIN
DECLARE @UnitRate smallmoney
SET @UnitRate = (
SELECT ur.UnitRate
FROM UnitRate as ur
WHERE ur.UnitRateID = @UnitRateID
)
RETURN @UnitRate
END;
GO
测试结果:
SELECT UnitRateID, UnitRate, PropertyID, dbo.CalculateDeposit(UnitRateID) as FN_UnitRate
FROM dbo.UnitRate;
输出:
UnitRateID UnitRate PropertyID FN_UnitRate
11 300.00 22000 300.00
12 350.00 23450 350.00
如您所见,该函数始终返回与UnitRate
关联的UnitRateID
的正确值。
我认为问题必定在其他地方......
我希望这种方法可以帮助你。