SQL:将SELECT值设置为SELECT语句值

时间:2015-07-19 10:09:27

标签: sql-server function tsql stored-procedures set

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测试将它隔离到已发布的函数...似乎错误可能不是语法而是我的数据和/或表本身?你们觉得怎么样?

1 个答案:

答案 0 :(得分:1)

返回@UnitRate值的select似乎没问题。

不容易理解为什么函数中的SET @UnitRate总是返回与UnitRateID = 11相关联的值,而只返回那些提供的元素。

很遗憾,您无法在PRINThere 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的正确值。

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

我希望这种方法可以帮助你。