0

あるデータベースから別のデータベースへの関数をスクリプト化しようとしています。これらの関数は私が書いたわけではないので、本来の意図はわかりません。そのうちの 1 つが私に問題を引き起こしています。この関数は、1 つのパラメーター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

データベースの 1 つにはGetPayDate2 つのパラメーターがあり、別のデータベースにはパラメーターがGetPayDate1 つしかない機能があるように聞こえます。したがって、混乱。

于 2012-09-12T15:13:34.740 に答える
0

上級プログラマーは時々間違っていることが知られています。

表示されるエラー メッセージは、この状況で表示されるはずです。以前は機能していたかどうかは関係ありません。現在は機能していません。関数には元々 2 つのパラメーターがあり、誰かがそれを変更したと理論付けます。(他のコードと同様に、SQL コードを適切にソース管理に保持している場合は、誰が、いつ、それを行っているかを知ることさえできます。データベース)。関数へのすべての参照が変更されたわけではなく、変更を行った開発者が取り組んでいたものだけが変更された可能性があります。

元のデータベースで動作しているそれらについては、そうではないかもしれないと思いますが、それらが呼び出されている方法では、人々がそれらを見ることができるエラーが発生しない可能性があります。または、実際には、誰かが更新するのを忘れたコードの部分が、アプリケーションによって定期的に呼び出されていません (たとえば、IF の 1 つのブランチのみ、または使用されなくなった proc など)。そのため、関数はアプリケーション全体で使用されている可能性がありますが、ほとんどの場合、1 つのパラメーターで適切に呼び出されています。

関数が最後に呼び出されたのがいつかはわかりません。ただし、dev でアプリケーションをテストし、同時に SQL プロファイラーを実行して、関数がどのように呼び出されているかを確認できます。ストアド プロシージャを使用する場合、最初に関数を呼び出すプロシージャを特定し、プロファイラーでそれらの実行を探す必要がある場合があります。

全体として、最初に何が起こっていたかは関係ありません。新しいデータベースでは機能しないため、呼び出しを変更する必要があります。

于 2012-09-12T17:18:58.163 に答える