本地数据库是sqlserver,中间表是oracle,具体表现为:其他中间表无论有没有数据都能访问,中间订单表AYY_ORDER在没数据也能访问,但有数据就无法访问了。
两个数据库对接是采用中间表定时同步方式的。
当他们把AYY_ORDER的数据清空了我们就能访问,但这表有数据就不能访问,查询代码是
SELECT *
FROM OPENQUERY(HD,'select * from HD4.AYY_ORDER')
中间表有数据就提示:
消息 7399,级别 16,状态 1,第 1 行
链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 报错。提供程序报告了意外的灾难性错误。
消息 7331,级别 16,状态 2,第 1 行
无法释放来自链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的行。
消息 0,级别 20,状态 0,第 0 行
当前命令发生了严重错误。应放弃任何可能产生的结果。
然后我们换了个命令:
select * from HD..HD4.AYY_ORDER
就提示
消息 7356,级别 16,状态 1,第 2 行
链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 为列提供的元数据不一致。对象 ""HD4"."AYY_ORDER"" 的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130。
中间表的"NUM"字段我们也检查过了,中间表是varchar2(20)
11 个解决方案
#1
的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130
你是不是修改数据库结构了?
你是不是修改数据库结构了?
#3
"NUM"列出问题了吧?
你可以尝试不选择num列再试试
例如:
select 不要num列的其他列 from ...
如果没问题,就检查num列.
你可以尝试不选择num列再试试
例如:
select 不要num列的其他列 from ...
如果没问题,就检查num列.
#4
无论是中间表还是本地表都没做修改,管理员也检查过表权限,没权限问题
#5
把NUM修改为varchar
#6
插入数据后运行
SELECT num, cls ,stat,src,vendor,wrh,psr,note,sumtotal,sumtax,rcvaddr
FROM OPENQUERY(HD,'select * from HD4.AYY_ORDER')
无论有没有查询列 "NUM" ,得到都是
消息 7399,级别 16,状态 1,第 1 行
链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 报错。提供程序报告了意外的灾难性错误。
消息 7331,级别 16,状态 2,第 1 行
无法释放来自链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的行。
消息 0,级别 20,状态 0,第 0 行
A severe error occurred on the current command. The results, if any, should be discarded.
查询:
select cls ,stat,src,vendor,wrh,psr,note,sumtotal,sumtax,rcvaddr from HD..HD4.AYY_ORDER
得到的是:
消息 7356,级别 16,状态 1,第 1 行
链接服务器 "HDAPP" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 为列提供的元数据不一致。
对象 ""HD40"."AYY_ORDER"" 的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130。
#7
中间表还有其他的表也是使用varchar2(64)的但都没问题。。。。就这表有问题,纠结啊
#8
1.确保你们访问的是那个指定的表,而不是由于用户不同面得到的不同表.
2.把该表删除重建一下试试.
2.把该表删除重建一下试试.
#9
你何必如此纠结?
--假设原来的表为TB
create table tmp as select * from tb
commit;
如果没有数据,则插入
insert into tmp select * from tmp
commit;
然后去对表tmp做测试,看是不是NUM列的问题.查对后,更改tb或者删除TB表,利用TMP生成tb
drop table tb
create table tb as select * from tmp
--假设原来的表为TB
create table tmp as select * from tb
commit;
如果没有数据,则插入
insert into tmp select * from tmp
commit;
然后去对表tmp做测试,看是不是NUM列的问题.查对后,更改tb或者删除TB表,利用TMP生成tb
drop table tb
create table tb as select * from tmp
#10
据我所知SQL Server没有varchar2数据类型,应该是在转换类型是出错了.
试试将Oracle里的AYY_ORDER表的NUM字段修改为varchar(20)类型(或nvarchar(20)).
试试将Oracle里的AYY_ORDER表的NUM字段修改为varchar(20)类型(或nvarchar(20)).
#11
谢谢大家的热心帮忙,问题已经解决!原因是oracle中间表的一个字段长度过长,达到1024,换成255就成功了,在此谢谢各位的帮助,积分平分!
#1
的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130
你是不是修改数据库结构了?
你是不是修改数据库结构了?
#2
#3
"NUM"列出问题了吧?
你可以尝试不选择num列再试试
例如:
select 不要num列的其他列 from ...
如果没问题,就检查num列.
你可以尝试不选择num列再试试
例如:
select 不要num列的其他列 from ...
如果没问题,就检查num列.
#4
无论是中间表还是本地表都没做修改,管理员也检查过表权限,没权限问题
#5
把NUM修改为varchar
#6
插入数据后运行
SELECT num, cls ,stat,src,vendor,wrh,psr,note,sumtotal,sumtax,rcvaddr
FROM OPENQUERY(HD,'select * from HD4.AYY_ORDER')
无论有没有查询列 "NUM" ,得到都是
消息 7399,级别 16,状态 1,第 1 行
链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 报错。提供程序报告了意外的灾难性错误。
消息 7331,级别 16,状态 2,第 1 行
无法释放来自链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的行。
消息 0,级别 20,状态 0,第 0 行
A severe error occurred on the current command. The results, if any, should be discarded.
查询:
select cls ,stat,src,vendor,wrh,psr,note,sumtotal,sumtax,rcvaddr from HD..HD4.AYY_ORDER
得到的是:
消息 7356,级别 16,状态 1,第 1 行
链接服务器 "HDAPP" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 为列提供的元数据不一致。
对象 ""HD40"."AYY_ORDER"" 的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130。
#7
中间表还有其他的表也是使用varchar2(64)的但都没问题。。。。就这表有问题,纠结啊
#8
1.确保你们访问的是那个指定的表,而不是由于用户不同面得到的不同表.
2.把该表删除重建一下试试.
2.把该表删除重建一下试试.
#9
你何必如此纠结?
--假设原来的表为TB
create table tmp as select * from tb
commit;
如果没有数据,则插入
insert into tmp select * from tmp
commit;
然后去对表tmp做测试,看是不是NUM列的问题.查对后,更改tb或者删除TB表,利用TMP生成tb
drop table tb
create table tb as select * from tmp
--假设原来的表为TB
create table tmp as select * from tb
commit;
如果没有数据,则插入
insert into tmp select * from tmp
commit;
然后去对表tmp做测试,看是不是NUM列的问题.查对后,更改tb或者删除TB表,利用TMP生成tb
drop table tb
create table tb as select * from tmp
#10
据我所知SQL Server没有varchar2数据类型,应该是在转换类型是出错了.
试试将Oracle里的AYY_ORDER表的NUM字段修改为varchar(20)类型(或nvarchar(20)).
试试将Oracle里的AYY_ORDER表的NUM字段修改为varchar(20)类型(或nvarchar(20)).
#11
谢谢大家的热心帮忙,问题已经解决!原因是oracle中间表的一个字段长度过长,达到1024,换成255就成功了,在此谢谢各位的帮助,积分平分!