2017-11-21 10 views
0

MS SQLサーバーでトリガーを作成しようとしていますが、「オペランドタイプのクラッシュ:日付がintと互換性がありません。私はエラーが私のPRINTステートメントから来ていると思うが、私はこの問題をいかに克服するかを知るためにSQLで十分な精通ではない。オペランドタイプのクラッシュ:日付がPRINTステートメントの変数とintと互換性がありません

ALTER TRIGGER utrInsteadUpdateTblMembership 
ON tblMembership INSTEAD OF UPDATE 
AS 
BEGIN 
    DECLARE @newPayDate date, @prevPayDate Date, @prevMemberNumber int 

    Select @newPayDate = MembershipFeePaidDate FROM inserted 
    Select @prevPayDate = MembershipFeePaidDate FROM deleted 
    Select @prevMemberNumber = MembershipID FROM deleted 


    IF @prevPayDate IS NOT NULL AND @prevPayDate > @newPayDate 
     BEGIN 
      UPDATE tblMembership 
       SET MembershipFeePaidDate = @newPayDate 
       WHERE @prevMemberNumber = MembershipID 
      UPDATE tblMembership 
       SET isCurrentMember = 1 
       WHERE @prevMemberNumber = MembershipID 
      PRINT 'Membership Number ' + @prevMemberNumber + ':' + ' payment date is ' + @newPayDate + ';' + ' prior payment date is ' + @prevPayDate 
     END 
    ELSE 
     BEGIN 
      PRINT 'Membership Number ' + @prevMemberNumber + ':' + ' new payment date ' + @newPayDate + ' is earlier than prior payment date ' + @newPayDate +';' + 'No change made' 
     END 
END 
+0

なぜトリガでprint文を出力しますか?これは開発とデバッグには有効ですが、このコードを公開する前に削除する必要があります。 –

答えて

2

これは、加算と連結のように解釈されるためです。動的SQLにも同じことが当てはまります

PRINT 'Membership Number ' + cast(@prevMemberNumber as char(8)) + ':' + ' new payment date ' + convert(varchar(10),@newPayDate,101) + ' is earlier than prior payment date ' + convert(varchar(10),@newPayDate,101) +';' + 'No change made' 
+1

同じ理由と効果のために、 'CONCAT( '会員番号'、@prevMemberNumber、 ':'、 '新しい支払い日'、@newPayDateなど)' *(暗黙的なデータ型強制は関数のシグネチャは文字列を受け入れるだけで、文字列にするのではなく、文字列にする "予期しない"/"誤解"のデータ型優先順位の影響を排除します。* – MatBailie

+1

OPがオンの場合は、@MatBailieを修正してください2012年以降。 – scsimon

関連する問題