1

事前に感謝します

テーブルに行を挿入する非常に基本的なストアド プロシージャがあります。今日まで問題なく動作していました

ここにスクリプトがあります

(
@emp varchar(16),
@logdate date,
@logtime time,
@term char(20),
@SSID char(16)
)
AS
INSERT INTO AccessLog (EmployeeID, LogDate, LogTime, TerminalID, InOut, ChangedBy) 
VALUES (@emp, @logdate, @logtime, @term, 3, @SSID)

5118 の文字列が渡されると、挿入は失敗します。この挿入が終了した後に起動するトリガーがいくつかあります。

ここが奇妙な部分です。変数に別の数値を渡すと@emp問題なく動作しますが、5118 を渡すと失敗します。

私が受け取るエラーは以下のとおりです。

メッセージ 241、レベル 16、状態 1、プロシージャ UpdateTimeWorked、行 27
文字列から日付や時刻を変換するときに変換に失敗しました。

失敗している手順は次のとおりです。強調表示されている行は行 27 です。

TRIGGER [dbo].[UpdateTimeWorked] ON [dbo].[TimeLog]
FOR UPDATE
AS
SET NOCOUNT ON
DECLARE @ID int;
DECLARE @RCDIDIN int;
DECLARE @RCDIDOUT int;
DECLARE @ComboIn datetime;
DECLARE @ComboOut datetime;
SELECT @ID = ID FROM INSERTED;
SELECT @ComboIn = LoginCombo FROM INSERTED;
SELECT @ComboOut = LogoutCombo FROM INSERTED;
SELECT @RCDIDIN = RCDIDIN FROM INSERTED;
SELECT @RCDIDOUT = RCDIDOUT FROM INSERTED;

**IF ( UPDATE(LogoutCombo))**
BEGIN
    IF (@RCDIDOUT != 0)
    BEGIN
        UPDATE TimeLog
            SET LogOutRND = (select CAST(dbo.roundtime(LogOutRND,0.25) AS TIME))
            WHERE ID = @ID
        UPDATE TimeLog
            SET LogOutComboRND = CAST(CAST(LogOutDate AS DATE) AS SMALLDATETIME) + CAST(LogOutRND AS TIME)
            WHERE ID = @ID
        UPDATE TimeLog
            SET TimeWorked = dbo.gettime(DATEDIFF(ss,LogInComboRND,LogoutComboRND))
            WHERE ID = @ID AND LogInEntered = 1 AND LogOutEntered = 1
        UPDATE TimeLog
            SET TimeWorked = (select CAST(dbo.roundtime(TimeWorked,0.25) AS TIME)), Rounded = 1
            WHERE ID = @ID AND LogInEntered = 1 AND LogOutEntered = 1
    END
END

IF ( UPDATE(LoginCombo))
BEGIN
    IF (@RCDIDIN != 0)
    BEGIN
        UPDATE TimeLog
            SET LogInRND = (select CAST(dbo.roundtime(LogInRND,0.25) AS TIME))
            WHERE ID = @ID
        UPDATE TimeLog
            SET LogInComboRND = CAST(CAST(LogInDate AS DATE) AS SMALLDATETIME) + CAST(LogInRND AS TIME)
            WHERE ID = @ID
        UPDATE TimeLog
            SET TimeWorked = dbo.gettime(DATEDIFF(ss,LogInComboRND,LogoutComboRND))
            WHERE ID = @ID AND LogInEntered = 1 AND LogOutEntered = 1
        UPDATE TimeLog
            SET TimeWorked = (select CAST(dbo.roundtime(TimeWorked,0.25) AS TIME)), Rounded = 1
            WHERE ID = @ID AND LogInEntered = 1 AND LogOutEntered = 1
    END
END


GO

なぜこれが機能しないのか、私は完全に空白です。

誰にもアイデアはありますか?

私が述べたように、@emp の他のエントリを渡すと、正常に実行されます。「5118」を渡すこともできますが、機能しますが、5118 は機能しません。

4

0 に答える 0