我采用如下事务DECLARE @transaction_name varchar(32) SELECT @transaction_name = 'my_tran' BEGIN TRANSACTION @transaction_name 
这中间有许多语句,操作数据库
其中有许多插入数据库,大约在1000条左右,这个能够执行接着是对表的数据更新,有个表要更新2个字段,其类型为varchar(7900),也就是对其数据更新,字符基本接近7000,如果对其中一个字段更新就可以,两个同时更新就不执行。要不只更新一个字段,要不都不更新。不知道为什么会这样?请高手指点,谢谢最后是对两个表的更新,数据较小,都执行。
COMMIT TRANSACTION my_tran
我安装的是sql2000,为什么会这样,事务不是要全部执行,要不都不执行的吗?请高手指点迷津,谢谢

解决方案 »

  1.   

    有个表要更新2个字段,其类型为varchar(7900),一列的行只能是8039 如果超过这个是会出错的
      

  2.   

    两个加起来超过8000了
    /*--化解字符串不能超过8000的方法 经常有人提到,用动态生成SQL语句的方法处理数据时,处理语句超长,无法处理的问题 
    下面就讨论这个问题: 
    --邹建   2003.9(引用请保留此信息)--*/ 
    --方法1.   多个变量处理 --根据查询结果定义变量(实际处理中,应该是估计需要多少个变量,定义足够多的变量个数,多定义变量并不影响处理,下面就多定义了一个) 
    --生成数据处理临时表 
    SELECT   id=IDENTITY(int,0,1), 
    g=0, 
    a=CAST(N ', '+QUOTENAME([name]) 
    +N '=SUM(CASE   [name]   WHEN   N '+QUOTENAME(name,N ' ' ' ') 
    +N '   THEN   [colid]   ELSE   0   END) ' 
    as   nvarchar(4000)) 
    INTO   #   FROM   syscolumns 
    WHERE   name> N ' ' 
    GROUP   BY   name --分组临时表 
    UPDATE   a   SET   G=id/i 
    FROM   #   a,(SELECT   i=3800/MAX(LEN(a))   FROM   #)b 
    SELECT   MAX(g)+1   as   N '需要的变量个数 '   FROM   # DECLARE   @0   nvarchar(4000),@1   nvarchar(4000),@2   nvarchar(4000),@3   nvarchar(4000),@4   nvarchar(4000) 
    SELECT   @0=N ' ',@1=N ' ',@2=N ' ',@3=N ' ',@4=N ' ' 
    SELECT   
    @0=CASE   g   WHEN   0   THEN   @0+a   ELSE   @0   END, 
    @1=CASE   g   WHEN   1   THEN   @1+a   ELSE   @1   END, 
    @2=CASE   g   WHEN   2   THEN   @2+a   ELSE   @2   END, 
    @3=CASE   g   WHEN   3   THEN   @3+a   ELSE   @3   END, 
    @4=CASE   g   WHEN   4   THEN   @4+a   ELSE   @4   END 
    FROM   # 
    EXEC(N 'SELECT   xtype '+@0+@1+@2+@3+@4+N '   FROM   syscolumns   GROUP   BY   xtype ') 
    DROP   TABLE   # /*--方法说明 优点:比较灵活,数据量大时只需要增加变量就行了.不用改动其他部分 
    缺点:要自行估计处理的数据,估计不足就会出错 
    --*/ 
      

  3.   

    有个表要更新2个字段,其类型为varchar(7900),一列的行只能是8039 如果超过这个是会出错的是两列啊,一个字段不是一列吗,2个字段就是2列?还有事务不是,完整性,要么全部执行,要不全不执行,既然出错了,为什么还能执行?请解惑,谢谢!
      

  4.   


    1
    是两列啊,一个字段不是一列吗,2个字段就是2列?--是的CREATE TABLE TBTEST(NAME Varchar(7900),ID VARCHAR(140))警告: 已创建表 'TBTEST',但其最大行大小(8065)超过了每行的最大字节数(8060)。如果结果行长度超过 8060 字节,则此表中行的 INSERT 或 UPDATE 将失败。其实SQL只能是8039,你把ID改成VARCHAR(139)就可以成功执行2还有事务不是,完整性,要么全部执行,要不全不执行,既然出错了,为什么还能执行?有些错误根据你的隔离级别,不会回滚,你可以加
    SET XACT_ABORT  ON 
      

  5.   

    CREATE TABLE TBTEST(NAME char(8000),ID CHAR(40))
    服务器: 消息 1701,级别 16,状态 2,行 1
    创建表 'TBTEST' 失败,因为行大小将为 8061(包括内部开销),而该值超过了表中允许的最大行大小 8060。
      

  6.   

    CREATE TABLE TBTEST(NAME VARCHAR(2),ID VARCHAR(2))BEGIN TRAN INSERT TBTEST SELECT 'A','BC'
    INSERT TBTEST SELECT 'B','BCD'
    INSERT TBTEST SELECT 'C','D'COMMIT TRAN
    GO
    SELECT * FROM TBTEST --DROP TABLE TBTESTNAME ID   
    ---- ---- 
    A    BC
    C    D(所影响的行数为 2 行)