函数不再接受额外的参数



我正在尝试为从一个数据库到另一个数据库的函数编写脚本。我没有写这些函数,所以我不知道它的初衷。其中一个给我带来了麻烦。函数GetPayDate只接受单个datetime参数。然而,当它被调用时:

SET @Minutes = (SELECT SUM(DATEDIFF(n, '1/1/2008', DateTime)) FROM Activities WHERE EmployeeID = @EmployeeID AND dbo.GetPayDate(DateTime, Homework) = @PayDate AND ActivityTypeID = 2)

它被传递了一个额外的参数。这种情况发生在多个位置。它在原始数据库上运行良好,但当我尝试将其脚本化为新数据库时,它会抛出:

Msg 8144, Level 16, State 2, Procedure GetTotalHours, Line 8
Procedure or function dbo.GetPayDate has too many arguments specified.

为什么它在一个数据库中工作,而在另一个数据库不工作,这个额外的参数最初可能在那里做什么?

源服务器定义:

CREATE FUNCTION [dbo].[GetPayDate](@Date DATETIME)     RETURNS DATETIME  AS  BEGIN    DECLARE @FirstPayPeriod DATETIME  DECLARE @PayPeriodsElapsed INT  DECLARE @PayPeriod DATETIME    SET @FirstPayPeriod = '5/4/2008'  SET @PayPeriodsElapsed = 0    IF @Date IS NULL   SET @PayPeriod = NULL  ELSE    BEGIN    SET @PayPeriodsElapsed = CONVERT(INT, DATEDIFF(d, @FirstPayPeriod, @Date) / 14)    IF  DATEDIFF(d, @FirstPayPeriod, @Date) % 14 > 0 SET @PayPeriodsElapsed = @PayPeriodsElapsed + 1    SET @PayPeriod = DATEADD (d, @PayPeriodsElapsed * 14, @FirstPayPeriod)    SET @PayPeriod = DATEADD (d, 5, @PayPeriod)   END    RETURN @PayPeriod    END      

来自目标服务器的定义:

CREATE FUNCTION [dbo].[GetPayDate](@Date DATETIME)     RETURNS DATETIME  AS  BEGIN    DECLARE @FirstPayPeriod DATETIME  DECLARE @PayPeriodsElapsed INT  DECLARE @PayPeriod DATETIME    SET @FirstPayPeriod = '5/4/2008'  SET @PayPeriodsElapsed = 0    IF @Date IS NULL   SET @PayPeriod = NULL  ELSE    BEGIN    SET @PayPeriodsElapsed = CONVERT(INT, DATEDIFF(d, @FirstPayPeriod, @Date) / 14)    IF  DATEDIFF(d, @FirstPayPeriod, @Date) % 14 > 0 SET @PayPeriodsElapsed = @PayPeriodsElapsed + 1    SET @PayPeriod = DATEADD (d, @PayPeriodsElapsed * 14, @FirstPayPeriod)    SET @PayPeriod = DATEADD (d, 5, @PayPeriod)   END    RETURN @PayPeriod    END  

听起来您的一个数据库具有带两个参数的GetPayDate,而另一个数据库的函数GetPayDate只有一个参数。因此产生了混乱。

众所周知,资深程序员有时会犯错。

在这种情况下,你得到的错误信息是你应该得到的。如果它以前有效,那就无关紧要了,现在不起作用了。我的理论是,这个函数最初有两个参数,有人更改了它。很可能所有对函数的引用都没有更改,只是进行更改的开发人员正在处理的引用

至于他们在原始数据库中工作,我怀疑他们可能不是,但他们被调用的方式可能不会在人们可以看到的地方出现任何错误。或者实际上,有些人忘记更新的代码部分并没有被应用程序定期调用(例如,可能只有IF的一个分支或不再使用的proc)。因此,也许函数在整个应用程序中都在使用,但在大多数情况下,它是用一个参数正确调用的。

你看不到上一次调用函数是什么时候。但是,您可以在dev上测试应用程序,同时运行SQL探查器来查看函数是如何被调用的。如果您使用存储的proc,您可能首先需要识别调用函数的proc并在探查器中查找它们的执行情况。

总之,最初发生的事情并不重要,它在新数据库中不起作用,因此必须更改调用。

最新更新