这是一个触发器:CREATE TRIGGER Insert2_Or_Update_sal 
  ON Teacher1
 FOR  update  
 AS
 BEGIN 
      declare  @Sal numeric(7,2),@Job varCHAR(10),@Tno varCHAR(6),@Sal0 numeric(7,2),@Job0 varCHAR(10),@Tno0 varCHAR(6)
      declare @msg char(50)
     --inserted是insert或update触发表临时表,参考下面帮助。
      select @Tno=Tno,@Job=Job,@Sal=Sal from Inserted 
      select @Tno0=Tno,@Job0=Job,@Sal0=Sal from Deleted 
      if abs(@Sal-@Sal0)>2000
       
      ROLLBACK TRANSACTION 
         set @msg='插入后的薪资比插入前的薪资变动过大,故将为您取消此插入操作!' 
         print @msg    
          
END 验证:
UPDATE Teacher1  SET Sal=1990 WHERE Tno='T002';
但是老师出现这样的错误:消息 8152,级别 16,状态 14,过程 Insert_Or_Update_sal1,第 11 行
将截断字符串或二进制数据。
语句已终止。

解决方案 »

  1.   

    最好这样传:UPDATE Teacher1  SET Sal=1990.0 WHERE Tno='T002';
      

  2.   

    不是varchar类型的吗,还会短吗? 我将数据类型加长后还是出现相同的错误,这是什么原因啊
      

  3.   

    这个表的结果贴出来看看Teacher1  
      

  4.   

    你定义的时候是这样, declare  @Sal numeric(7,2),但是用的时候是字符型,好像不行哦
      

  5.   

     
    这是教师表,我刚才取得是一部分CREATE TABLE Teacher1
    ( Tno CHAR(6) NOT NULL,
      Tname CHAR(8), 
      Tsex CHAR(2),
      Tage SMALLINT, 
      Job CHAR(10),  /*职称*/
      Deptno CHAR(20),     /*所在系编号*/
      Sal NUMERIC(7,2),     /*工资*/
      Deduct NUMERIC(7,2),  /*扣除*/
      CONSTRAINT  PK_Teacher1  PRIMARY KEY(Tno) );
      

  6.   

    那你不要传varchar,穿1990.0试试
      

  7.   

    UPDATE Teacher1  SET Sal=1990 WHERE Tno='T003';
     
     INSERT INTO Teacher1(tno,sal)
     VALUES('t003',2000)
     
     SELECT * FROM dbo.teacher1我模拟了一下,都成功,而且你的触发器有点问题,都成功了,但是还是显式那个中文
      

  8.   

    试试,并发表上所有其他触发器禁掉CREATE TRIGGER Insert2_Or_Update_sal ON Teacher1
         FOR UPDATE
     AS
         BEGIN 
             DECLARE @Sal NUMERIC(7, 2) ,
                 @Job VARCHAR(15) ,
                 @Tno VARCHAR(15) ,
                 @Sal0 NUMERIC(7, 2) ,
                 @Job0 VARCHAR(15) ,
                 @Tno0 VARCHAR(15)
             DECLARE @msg CHAR(50)
     
             SELECT  @Tno = Tno ,
                     @Job = Job ,
                     @Sal = Sal
             FROM    Inserted 
             SELECT  @Tno0 = Tno ,
                     @Job0 = Job ,
                     @Sal0 = Sal
             FROM    Deleted 
             IF ABS(@Sal - @Sal0) > 2000 
                 SET @msg = '插入后的薪资比插入前的薪资变动过大,故将为您取消此插入操作!' 
             PRINT @msg    
             ROLLBACK TRANSACTION 
         END