我的数据库里面原来有一个表A,里面有一个image列AA,现在另一个表B里面也有一个image列BB,要用到A表AA列的某些数据。我的手提电脑上装的Sql Server 2005,我用下面的Sql语句执行了这个操作。update B set bb=(select AA from A where idInTable=B.id and tableName='B')
 where id in (select idInTable from A where tableName='B')意思就是把A表里面,和B表有关的那些image列的内容,存入B表的BB列。
在我的手提电脑上可以执行成功。但在服务器上执行就报错了,错误信息:“对于局部变量,text、ntext 和 image 数据类型无效。”
我估计是在2000上不能做这个操作。于是我又写了一段执行游标的SQL代码,先把A表的AA列的内容,保存到一个变量@aaa中,然后再保存到B表的BB列。结果却是连我的手提电脑都通过不了。错误信息还是上面那条。
我想是不是有个什么开关设置,没有设置好。哪位网友指教一下。谢谢。

解决方案 »

  1.   

    image类型的变量需要用二进制而且用textwrite
      

  2.   

    那么请问,SQl代码应该怎么写呢?
      

  3.   

    错误信息:“对于局部变量,text、ntext 和 image 数据类型无效。”
    --
    你具体执行的代码是什么,局部变量不能定义为
    text、ntext 和 image 数据类型
    必要在存储过程的参数里使用 image类型
      

  4.   

    复3楼:刚才有空试了一下存储过程(其实是因为已经忘记了怎么搞存储过程,看了两天才重新上手),还是不行,还是那句话:
    对于局部变量,text、ntext 和 image 数据类型无效。
    CREATE PROCEDURE proc_fr as
    declare @att image
    对于这两句代码,一执行就报错了。但我看到有“局部变量”几个字,我是不是定义一个全局变量,就可以做这件事情呢?怎样可以定义一个全部变量呢?
      

  5.   

    唉,如果实在不行,只能用JAVA先把image的内容从A表读出来到InputStream中,然后再保存到B表中了。
    但,这样操作的话,实在有点怪。数据库里面的内容,居然要通过其他编程语言来中转?
      

  6.   

    没想到,用JAVA编了一个方法来处理上面的image内容,也还是出现问题。
    我把image内容从A表取出,放到InputStream中,然后再放入B表的BB列。代码如下:String strsql0="select snInA, right(docName, 3) attExt, AA" +
    " from A where tableName='B' order by snInA";
    String strsql1="update B set BBExt=?, BB=? where sn=";
    ResultSet rs=db.executeQuery(strsql0, message);
    Connection conn=db.getConnection();
    PreparedStatement pst;
    try{
    InputStream is=null;
    String sn="";
    String ext="";
    while (rs.next()){
    sn=rs.getString("snInA");
    pst=conn.prepareStatement(strsql1+sn);
    ext=rs.getString("attExt");
    pst.setString(1, ext);
    is=rs.getBinaryStream("AA");
    System.out.println("empSn, ext, is.length="+sn+", "+ext+", "+is.available());
    pst.setBinaryStream(2, is, is.available());
    if (pst.executeUpdate()<1) //*
    throw new Exception("更新数据表出错!\n"+strsql1);
    ok=true;
    pst.close();
    }
    if (is!=null)
    is.close();
    }catch(Exception e){
    e.printStackTrace();
    }运行到*处,报异常:流值不是指定的长度。指定长度为 7,845,实际长度为 22,118。
    后来查了一下,如果把is保存到硬盘的话,生成的文件的大小,正好是22118。但为什么保存到数据库的内容长度就是7845呢?
    因为这种不确定性,is.available()我可不可以设一个较大的值呢?