Sql server SQL函数返回错误的值

Sql server SQL函数返回错误的值,sql-server,tsql,user-defined-functions,Sql Server,Tsql,User Defined Functions,我有一个函数,它有两个参数:@iEmployeeID和@dDate 它的目的是找到给定参数的预算率。换句话说,它应该发现最大日期小于或等于@dDate参数,并返回相应的速率 预算费率为: Start Rate ------- ----- 01-01-2008 600 01-01-2009 800 01-01-2010 700 当提供参数06-06-2008时,它正确返回600。 当提供参数03-03-2009时,它正确返回800 提供参数02-02-2010时

我有一个函数,它有两个参数:@iEmployeeID和@dDate

它的目的是找到给定参数的预算率。换句话说,它应该发现最大日期小于或等于@dDate参数,并返回相应的速率

预算费率为:

Start Rate ------- ----- 01-01-2008 600 01-01-2009 800 01-01-2010 700 当提供参数06-06-2008时,它正确返回600。 当提供参数03-03-2009时,它正确返回800 提供参数02-02-2010时,应返回700。该函数实际上返回800。 臭虫在哪里

虫子搜寻:
如果我对这些数字进行调整,如果它有两个值可供选择,那么它似乎会选择最大的速率。

您应该使用top 1选择top 1,然后通过ORDER BY获得相应的速率


当然你的代码根本不应该分组

SELECT TOP 1 @result = decRate
FROM BudgetRates BR
WHERE BR.iRefEmployeeID = @iEmployeeID
AND BR.dStart <= @dDate
ORDER BY BR.dStart DESC

RETURN @result
试试这个伴侣:

select @result = decRate
    from BudgetRates
      inner join (
       select max(BR.dStart) as MaxDate
       from BudgetRates
      where BR.dStart <= @dDate
        and BR.iRefEmployeeID = @iEmployeeID
                 ) temp on tmep.MaxDate = BudgetRates.dStart
                   and BudgetRates.iRefEmployeeID = @iEmployeeID

看起来你应该在这里使用排名函数

DECLARE @result decimal(38,20)

SELECT @result = decRate 
(
  SELECT decRate, ROW_NUMBER() OVER (ORDER BY BR.dStart DESC) rownum
  FROM BudgetRates BR
  WHERE BR.iRefEmployeeID = @iEmployeeID
  AND BR.dStart <= @dDate
) sub
WHERE rownum = 1

RETURN @result

当我这样做的时候,我得到了。在函数中使用副作用运算符“SET ROW COUNT”无效。噢。。我忘了你不能在函数中这样做。。当我在选择列表中遗漏GROUP BY I get时,更正Top 1:列“BudgetRates.decRate”无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。Top 1选择的是600。@DoStuffz-如果您收到该消息,您不可能遗漏了GROUP BY。@DoStuffz:如果Top 1选择的是600,听起来好像您遗漏了ORDER BY上的描述。Bugghunting:现在如果我破坏了数据并将700的费率编辑为810。当问题是2010年2月2日时,它正确地选择了这个比率。啊,有一些东西。给出正确答案的解决方案:声明@result decimal38,20从tbl_eCon_Target_BudgetRates BR中选择TOP 1@result=decratedWeekday,其中BR.iRefEmployeeID=@IEEmployeeId按decratedWeekday分组,dStart具有MAXBR.dStart
select @result = decRate
    from BudgetRates
      inner join (
       select max(BR.dStart) as MaxDate
       from BudgetRates
      where BR.dStart <= @dDate
        and BR.iRefEmployeeID = @iEmployeeID
                 ) temp on tmep.MaxDate = BudgetRates.dStart
                   and BudgetRates.iRefEmployeeID = @iEmployeeID
DECLARE @result decimal(38,20)

SELECT @result = decRate 
(
  SELECT decRate, ROW_NUMBER() OVER (ORDER BY BR.dStart DESC) rownum
  FROM BudgetRates BR
  WHERE BR.iRefEmployeeID = @iEmployeeID
  AND BR.dStart <= @dDate
) sub
WHERE rownum = 1

RETURN @result