Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 将Foxpro表导入SQL Server_Sql Server 2008_Tsql_Visual Foxpro_Foxpro - Fatal编程技术网

Sql server 2008 将Foxpro表导入SQL Server

Sql server 2008 将Foxpro表导入SQL Server,sql-server-2008,tsql,visual-foxpro,foxpro,Sql Server 2008,Tsql,Visual Foxpro,Foxpro,我们有800个不同的.dbf文件,需要将它们的文件名作为新表名加载到SQL Server中,因此必须将file1.dbf加载到SQL Server中的表file1中 像这样,我们需要将所有800个Foxpro表加载到sqlserver中。有人对此有想法吗,或者有剧本吗?非常感谢您的帮助。此问题有多种解决方案。一种是使用VFP附带的升迁向导。我只试了原版,一点也不好。从那以后我就没用过。您可以尝试上载一个测试数据库,其中有一个表,比如说有一百万行,只是为了看看使用它是否可行,使用一百万行不会超过一

我们有800个不同的.dbf文件,需要将它们的文件名作为新表名加载到SQL Server中,因此必须将file1.dbf加载到SQL Server中的表file1中


像这样,我们需要将所有800个Foxpro表加载到sqlserver中。有人对此有想法吗,或者有剧本吗?非常感谢您的帮助。

此问题有多种解决方案。一种是使用VFP附带的升迁向导。我只试了原版,一点也不好。从那以后我就没用过。您可以尝试上载一个测试数据库,其中有一个表,比如说有一百万行,只是为了看看使用它是否可行,使用一百万行不会超过一分钟

我所做的是创建一个生成器,该生成器将按照我想要的映射创建SQL server表,即:memo to varchar或varbinary MAX、char to varchar等。然后使用我编写的基于C的activex代码加载表-一次加载多个表其他加载表的方式非常慢。此后,该代码用于创建SQL server表和\或将现有客户的数据传输到SQL server

另一种有效的方法是,使用VFPOLEDB创建一个链接到VFP的服务器,然后使用OpenQuery获取表的结构和数据:

select * into [TableName] 
from OpenQuery(vfpserver, 'select * from TableName ...')

这个函数也很快,允许您在查询中使用VFP特定的函数,但是结果字段类型可能不是您喜欢的类型

下面是用FoxPro 9编写的解决方案。您可能需要修改一下,因为我只处理了3种数据类型。您还必须注意SQL保留字作为字段名


可能重复使用ODBC DSN或OLE DBN如果您有可用的Visual FoxPro,请从www.vfpx.org获取最新版本的升迁向导并使用它。请注意,VFP和Sql Server对数值数据类型的精度有不同的定义。例如,如果您的vfp字段是Numeric4,1,并且您在该字段中选择了一个值为100的记录,Sql Server将被打乱。“关于这件事的一个小讨论。”Supersnake,我知道情况,我不明白你为什么给我发这个消息。使用我提出的生成SQL server表并通过C activex进行导入的方法,不会出现这样的问题。OpenQuery也没有这样的问题。你的警告对我没有意义。毕竟,我希望这将是升级到SQL server时唯一需要注意的事情。我的评论是针对找到此页面的未来用户。我们最近在Sql Server Management Studio中使用了OpenQuery语句来获取VFP数据,这就是我们获取错误的原因。@Supersnake,使用OpenQuery,您可以使用VFP特定的函数,正如我前面所说的。你可以用它来防止这个问题。在VFP中使用数字数据类型从来都不是一个好主意。
SET SAFETY OFF
CLOSE ALL
CLEAR ALL
CLEAR

SET DIRE TO "C:\temp"

** house keeping
RUN del *.fxp
RUN del *.CDX
RUN del *.bak
RUN del *.err
RUN del *.txt

oPrgDir = SYS(5)+SYS(2003) && Program Directory
oPath = "C:\temp\pathtodbfs"  && location of dbfs

CREATE TABLE dbfstruct (fldno N(7,0), fldnm c(16), fldtype c(20), fldlen N(5,0), fldpoint N(7,0)) && dbf structure table

STORE SQLSTRINGCONNECT("DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=testdbf;UID=root;PWD=root; OPTION=3") TO oConn  && SQL connection

SET DIRE TO (m.oPath)
STORE ADIR(aFL, "*.dbf") TO iFL && getting list of dbfs
SET DIRE TO (m.oPrgDir)
FOR i = 1 TO iFL
    IF AT("dbfstruct.dbf", LOWER(aFL(i,1))) = 0 THEN
        USE oPath + "\" + aFL(i,1)
        LIST STRUCTURE TO FILE "struct.txt" && output dbf structure to text file"
        SET DIRE TO (m.oPrgDir)

        USE dbfstruct
        ZAP
        APPEND FROM "struct.txt" TYPE SDF
        DELETE FROM dbfstruct WHERE fldno = 0 && removing non esential text
        PACK
        CLEAR
        DELETE FILE "struct.txt"

        SET DIRE TO (m.oPrgDir)

        =SQLEXEC(oConn, "DROP TABLE IF EXISTS testdbf." + STRTRAN(LOWER(aFL(i,1)),".dbf", "")) && needed to remove tables already created when I was testing

        sSQL = "CREATE TABLE testdbf." + STRTRAN(LOWER(aFL(i,1)),".dbf", "") + " ("

        SELECT dbfstruct
        GOTO TOP
        DO WHILE NOT EOF()
            @1,1 SAY "CREATING QUERY:  " + aFL(i,1)
            sSQL = sSQL + ALLTRIM(LOWER(dbfstruct.fldnm)) + " "
            * You may have to add below depending on the field types of your DBFS
            DO CASE
            CASE ALLTRIM(dbfstruct.fldtype) == "Character"
                sSQL = sSQL + "VARCHAR(" + ALLTRIM(STR(dbfstruct.fldlen)) + "),"
            CASE ALLTRIM(dbfstruct.fldtype) == "Numeric" AND dbfstruct.fldpoint = 0
                sSQL = sSQL + "INT(" + ALLTRIM(STR(dbfstruct.fldlen)) + "),"
            CASE ALLTRIM(dbfstruct.fldtype) == "Numeric" AND dbfstruct.fldpoint > 0
                sSQL = sSQL + "DECIMAL(" + ALLTRIM(STR(dbfstruct.fldlen)) + "),"
            OTHERWISE
                =MESSAGEBOX("Unhandled Field Type: " + ALLTRIM(dbfstruct.fldtype) ,0,"ERROR")
                CANCEL
            ENDCASE
            SELECT dbfstruct
            SKIP
        ENDDO
        sSQL = SUBSTR(sSQL, 1, LEN(sSQL)-1) + ")"
        STORE SQLEXEC(oConn, sSQL) TO iSQL

        IF iSQL < 0 THEN
            CLEAR
            ?sSQL
            STORE FCREATE("sqlerror.txt") TO gnOut && SQL of query in case it errors
            =FPUTS(gnOut, sSQL)
            =FCLOSE(gnOut)
            =MESSAGEBOX("Error creating table on MySQL",0,"ERROR")
            CANCEL
        ENDIF

        CLOSE DATABASES
    ENDIF
ENDFOR

=SQLDISCONNECT(oConn)

SET DIRE TO (m.oPrgDir)

SET SAFETY ON