我的数据库里面原来有一个表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列。结果却是连我的手提电脑都通过不了。错误信息还是上面那条。
我想是不是有个什么开关设置,没有设置好。哪位网友指教一下。谢谢。
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列。结果却是连我的手提电脑都通过不了。错误信息还是上面那条。
我想是不是有个什么开关设置,没有设置好。哪位网友指教一下。谢谢。
--
你具体执行的代码是什么,局部变量不能定义为
text、ntext 和 image 数据类型
必要在存储过程的参数里使用 image类型
对于局部变量,text、ntext 和 image 数据类型无效。
CREATE PROCEDURE proc_fr as
declare @att 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()我可不可以设一个较大的值呢?