SQL: 将SETting值发布到SELECT语句值

SQL: Issue SETing value to SELECT statement value

简短版本:无论将什么 UnitRateID 传递给函数并存储在@UnitRateID

中,SET @UnitRate 始终设置为相同的值

长版:当我的函数在不同的@UnitRateID 中传递时,我无法将@UnitRate 设置为不同的值。似乎无论传入什么 @UnitRateID,我总是会从我的 SELECT 语句中得到 UnitRate returned,我将 @UnitRate 设置为 UnitRateID 的值 11.

我相信我正确地传递了一个不同的值,因为我用于创建预订的存储过程将使用不同的 UnitRateID

正确地填充我的 table

我还应该注意,如果我将 SELECT 语句和 运行 它放在 @UnitRate 的设置之外,并手动将 WHERE ur.UnitRateID = @UnitRateID 设置为 WHERE ur.UnitRateID = n 其中 n 是我的 UnitRateID 我将得到不同的 return 值。有一个注释掉的部分,我在其中测试以查看是否由于我计算住宿税率的其他函数而出现问题,并且我发现当我将@deposit 设置为@UnitRate 时,该错误确实在该函数中,因为无论传入的 UnitRateID 是什么,我都得到相同的存款价值(@UnitRate 的存款价值)。

我这里的 SETing 语法正确吗?我如何设置它以使其始终抓取并且 return 例如 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

调用示例[​​=48=]:

SET @deposit = dbo.CalculateDeposit(@UnitRateID, 'YYYY-MM-DD')

然后我获取该存款值并将其传递到存储过程中。并不是说这里的 @UnitRateID 和 @deposit 不在我展示的函数中,因此不在同一范围内。 @UnitRateID 实际上是一个硬编码值,当我通常调用它并且@deposit 被传递到我的存储过程中时。

编辑:

请求 属性 和 UnitRate Table 数据http://gyazo.com/3f399914bd889c52e4cc85be97fcc2e6

问题可能不是代码??:

我在这里发帖时假设,在检查了大量数据和其他代码之后,我的代码和语法存在一些问题。我根据注释掉的 SET @deposit = @UnitRate 测试将它隔离到发布的函数中......似乎错误可能不是语法而是我的数据和/或 tables 本身?大家怎么看?

return 的 @UnitRate 的值似乎还可以。

很难理解为什么你的函数 return 中的 SET @UnitRate 总是与 UnitRateID = 11 相关联的值只有那些提供的元素。

不幸的是,您不能在 TSQL 中的函数内使用 PRINT 语句(here Whosebug 中的 post)。

您可以尝试另一种方法:修改函数和 return @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

如您所见,函数 return 始终是关联到 UnitRateIDUnitRate 的正确值。

我认为问题一定出在其他地方...

希望这个方法对你有所帮助。