Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 函数不再接受额外参数_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 函数不再接受额外参数

Sql server 函数不再接受额外参数,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在尝试将函数从一个数据库编写到另一个数据库。我没有写这些函数,所以我不知道最初的意图。其中一个给了我一些麻烦。函数GetPayDate只接受一个datetime参数。但是,在调用时: SET @Minutes = (SELECT SUM(DATEDIFF(n, '1/1/2008', DateTime)) FROM Activities WHERE EmployeeID = @EmployeeID AND dbo.GetPayDate(DateTime, Homework) = @PayDa

我正在尝试将函数从一个数据库编写到另一个数据库。我没有写这些函数,所以我不知道最初的意图。其中一个给了我一些麻烦。函数
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
只有一个参数。因此产生了混乱。

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

您得到的错误消息是在这种情况下应该得到的。如果它以前起作用,那就无关紧要了,现在不起作用了。我认为函数最初有两个参数,有人改变了它。(如果您在源代码管理中正确地保留了sql代码,因为它与其他代码一样属于源代码管理,那么您甚至可以告诉谁和什么时候,如果您没有这样做,那么这是一个在迁移到新数据库时建议这样做的好时机)。很可能所有对函数的引用都没有更改,只是那些进行更改的开发人员正在处理的引用

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

您无法看到上次调用函数的时间是什么时候。但是,您可以在dev上测试应用程序,同时运行sqlprofiler以查看函数的调用方式。如果使用存储的进程,可能首先需要识别调用函数的进程,并在探查器中查找它们的执行情况


总之,最初发生了什么并不重要,它在新数据库中无法工作,因此必须更改调用

您可以按照本文查看用户定义函数的定义。在这个定义中有什么特别的东西需要我去了解吗?你能发布两个服务器的定义吗?@Jim-我已经在我的问题中编辑了这些定义,但是它们是相同的,因为
GetPayDate
是成功编写脚本的函数之一。好的,如果只发送一个参数,函数是否工作?编辑Nevermind,看起来效果不错。我想只要去掉代码中的第二个参数,看看会发生什么(可能什么都没有,因为没有使用第二个参数)。原始数据库是否来自较旧版本的SQL Server?否,它们都只有一个参数。它们实际上完全相同,因为
GetPayDate
是脚本编写的函数之一。在这种情况下,请发布函数的代码(或至少是签名)。我已经将定义放入了问题中,这似乎只是没有换行符的代码。不能在其他数据库中,否则会出现
找不到
错误,因为函数由两部分组成的名称使用。是的,这就是我最后要做的。我不想改变它的原因是因为我不知道它为什么在那里。我不想删除未知用途的代码。然而,
家庭作业
列是位数据类型,自2008年以来一直不是1,所以希望它不会成为问题。