我用下面语句导入sql server时,
/////////////////////////////////////////////
select * into [B101-2005] from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=D:\dx\data\year','select * from [B101-2005]')
发生如下错误:
////////////////////////////////////////
服务器: 消息 7341,级别 16,状态 2,行 1
未能得到列 '[MSDASQL].b181' 的当前行的值(从 OLE DB 提供程序 'MSDASQL' 中)。由于数据值溢出了提供程序所用数据类型的取值范围,转换失败。
[OLE/DB provider returned message: 多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。]
OLE DB 错误跟踪[OLE/DB Provider 'MSDASQL' IRowset::GetData returned 0x80040e21: Data status returned from the provider: [COLUMN_NAME=b181 STATUS=DBSTATUS_E_DATAOVERFLOW]]。
/////////////////////////////////////////////
由于在vf中,b181该列是numeric型的,有些数据超过了6位,所以这样就产生了上述错误,我把该表中的b181大于6位的记录删除,就没有问题。难道导入时,sql server把vf中的numeric当作int来看待,怎么不把它导成sql server中的numeric,这样就不会溢出了。
现在问题是,大于6位的记录不能删除,如何才能导入?sql server中的表原始不存在的,要从vf中导入后才存在,所以修改sql server表结构是不行的。并且导入的表的数目也是不确定的。谢谢各位!
/////////////////////////////////////////////
select * into [B101-2005] from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=D:\dx\data\year','select * from [B101-2005]')
发生如下错误:
////////////////////////////////////////
服务器: 消息 7341,级别 16,状态 2,行 1
未能得到列 '[MSDASQL].b181' 的当前行的值(从 OLE DB 提供程序 'MSDASQL' 中)。由于数据值溢出了提供程序所用数据类型的取值范围,转换失败。
[OLE/DB provider returned message: 多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。]
OLE DB 错误跟踪[OLE/DB Provider 'MSDASQL' IRowset::GetData returned 0x80040e21: Data status returned from the provider: [COLUMN_NAME=b181 STATUS=DBSTATUS_E_DATAOVERFLOW]]。
/////////////////////////////////////////////
由于在vf中,b181该列是numeric型的,有些数据超过了6位,所以这样就产生了上述错误,我把该表中的b181大于6位的记录删除,就没有问题。难道导入时,sql server把vf中的numeric当作int来看待,怎么不把它导成sql server中的numeric,这样就不会溢出了。
现在问题是,大于6位的记录不能删除,如何才能导入?sql server中的表原始不存在的,要从vf中导入后才存在,所以修改sql server表结构是不行的。并且导入的表的数目也是不确定的。谢谢各位!
在SQL中强制转换一下,如:
select 字段1,字段2, cast(字段3 as decimal(18,2) as 字段3)
into [B101-2005] from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=D:\dx\data\year','select * from [B101-2005]')
'select mton(LURUFCODE) LURUFCODE ,LURUPURDAY from C15A') as avf中mton可以让一个 numberic的5转换为numberic13,这样,你sql中的numberic13就足够大了。
--------------------------
ps,另外一个更稳定更强大的方法是把dbf中字段类型总结一下,然后自己写转换函数,先create table 在sql中,然后利用这个方法insert.good luck!