【问题标题】:SQL: Issue SETing value to SELECT statement valueSQL:向 SELECT 语句值发出 SETing 值
【发布时间】: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 测试将它隔离到发布的函数中......似乎错误可能不是语法,而是我的数据和/或表本身?大家觉得呢?

【问题讨论】:

  • 能否提供PropertyUnitRate表中的数据样本?
  • gyazo 链接好吗?
  • 您可以在存储过程中添加print语句来帮助您调试它。例如print '@UnitRateID = ' + cast(@UnitRateID as varchar(32)
  • 我最初是通过 SELECTing 我的 sproc 的结果来进行的,但是在插入之前添加打印(因此在 sproc 调用期间传入的原始数据)显示就我的 sproc 而言担心,我确实在正确传递不同的 UnitRateID(由 sproc @UnitRateID 变量捕获)。

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


【解决方案1】:

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

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

不幸的是,您不能在 TSQL 的函数中使用 PRINT 语句(here stackoverflow 中的帖子)。

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

如您所见,该函数始终返回与UnitRateID 关联的UnitRate 的正确值。

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

我希望这种方法对您有所帮助。

【讨论】:

  • 确实修改了我的函数并制作了我自己的特定用途函数来发现这个问题,这让我相信问题可能在于某个地方的触发器和/或数据库中的数据与我的 funcs/sprocs 交互/triggers 来产生这个问题。感谢您的周到和耗时的回答,这不是一个直接的答案,但它为我指明了正确的方向!
猜你喜欢
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多