0

我正在尝试将函数从一个数据库编写到另一个数据库。这些函数不是我写的,所以不知道初衷。其中之一给我带来了一些麻烦。该函数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  
4

2 回答 2

0

听起来您的一个数据库有GetPayDate两个参数,而另一个数据库GetPayDate只有一个参数。因此混乱。

于 2012-09-12T15:13:34.740 回答
0

众所周知,高级程序员有时会犯错。

您收到的错误消息是在这种情况下应该得到的。以前是否有效无关紧要,现在无效。我推测该函数最初有两个参数并且有人更改了它。(如果您已将 sql 代码正确地保存在源代码控制中,因为它与任何其他代码一样,您甚至可以告诉谁以及何时,如果您没有,那么这是建议您这样做的好时机,因为您正在迁移到一个新的数据库)。可能对函数的所有引用都没有更改,只是进行更改的开发人员正在处理的那些。

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

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

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

于 2012-09-12T17:18:58.163 回答