我用下面语句导入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表结构是不行的。并且导入的表的数目也是不确定的。谢谢各位!

解决方案 »

  1.   

    直接使用SQL的导入导出功能,在导入时可以更换字段类型.
      

  2.   


    在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]')
      

  3.   

    我也遇到和你一样的地方。解决方法是导入时候利用vf的转换函数,另外需要写成一个函数利用ado/dao把dbf的字段结合成为一个字符串。select LURUFCODEfrom openrowset('MSDASQL',  'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB= D:\',
    'select  mton(LURUFCODE) LURUFCODE ,LURUPURDAY from C15A') as avf中mton可以让一个 numberic的5转换为numberic13,这样,你sql中的numberic13就足够大了。
    --------------------------
    ps,另外一个更稳定更强大的方法是把dbf中字段类型总结一下,然后自己写转换函数,先create table 在sql中,然后利用这个方法insert.good luck!