我正在尝试将函数从一个数据库编写到另一个数据库。我没有写这些功能,所以我不知道原来的意图。其中一个给我带来了一些麻烦。函数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
答案 0 :(得分:0)
听起来你的一个数据库有GetPayDate
有两个参数,而另一个数据库有GetPayDate
只有一个参数。因此混乱。
答案 1 :(得分:0)
有时候高级程序员有错误。
您收到的错误信息是您在这种情况下应该得到的。如果它之前有效则无关紧要,现在它不起作用。我会推测该函数有两个参数,有人改了它。 (如果你已经将源代码控制中的sql代码妥善保存,因为它像任何其他代码一样,你甚至可以告诉谁和什么时候,如果你没有,那么这是一个建议这样做的好时机,因为你正在转向新的数据库)。可能所有对函数的引用都没有改变,只有那些进行改变的开发人员正在进行修改。
对于他们在原始数据库中工作,我怀疑他们可能不会,但他们被调用的方式可能不会冒出人们可以看到它们的任何错误。或者实际上,应用程序不会定期调用有人忘记更新的代码部分(例如,可能只有IF的一个分支或不再使用的proc)。因此,可能在整个应用程序中使用该函数,但在大多数情况下,使用一个参数正确调用它。
您无法查看上次调用函数的时间。但是,您可以在开发人员上测试应用程序并同时运行SQL事件探查器以查看函数的调用方式。如果使用存储过程,则可能首先需要识别调用该函数的过程并在分析器中查找它们的执行。
总而言之,最初发生的事情并不重要,它在新数据库中不起作用,因此必须更改呼叫。