Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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 从Microsoft Access创建表DDL_Sql_Ms Access - Fatal编程技术网

Sql 从Microsoft Access创建表DDL

Sql 从Microsoft Access创建表DDL,sql,ms-access,Sql,Ms Access,是否有任何简单的方法可以从MicrosoftAccess(2007)检索表创建DDL,或者我必须使用VBA自己编写代码来读取表结构 我有大约30个表要移植到Oracle,如果我们可以从Access定义创建这些表,这将使工作更轻松。我已经这样做了: 有一个工具可以从访问SQL Server“升迁”。这样做,然后使用优秀的SQL Server工具生成脚本 您可以使用Access中的导出功能将表导出到ODBC数据源。将ODBC数据源设置为Oracle数据库,然后右键单击Access“Tables”选项

是否有任何简单的方法可以从MicrosoftAccess(2007)检索表创建DDL,或者我必须使用VBA自己编写代码来读取表结构

我有大约30个表要移植到Oracle,如果我们可以从Access定义创建这些表,这将使工作更轻松。

我已经这样做了:

有一个工具可以从访问SQL Server“升迁”。这样做,然后使用优秀的SQL Server工具生成脚本


您可以使用Access中的导出功能将表导出到ODBC数据源。将ODBC数据源设置为Oracle数据库,然后右键单击Access“Tables”选项卡中的表并选择导出。ODBC是“文件格式”之一,它将弹出通常的ODBC对话框。

谢谢其他建议。在我等待的时候,我编写了一些VBA代码来实现它。它并不完美,但为我完成了任务

Option Compare Database
Public Function TableCreateDDL(TableDef As TableDef) As String

         Dim fldDef As Field
         Dim FieldIndex As Integer
         Dim fldName As String, fldDataInfo As String
         Dim DDL As String
         Dim TableName As String

         TableName = TableDef.Name
         TableName = Replace(TableName, " ", "_")
         DDL = "create table " & TableName & "(" & vbCrLf
         With TableDef
            For FieldIndex = 0 To .Fields.Count - 1
               Set fldDef = .Fields(FieldIndex)
               With fldDef
                  fldName = .Name
                  fldName = Replace(fldName, " ", "_")
                  Select Case .Type
                     Case dbBoolean
                        fldDataInfo = "nvarchar2"
                     Case dbByte
                        fldDataInfo = "number"
                     Case dbInteger
                        fldDataInfo = "number"
                     Case dbLong
                        fldDataInfo = "number"
                     Case dbCurrency
                        fldDataInfo = "number"
                     Case dbSingle
                        fldDataInfo = "number"
                     Case dbDouble
                        fldDataInfo = "number"
                     Case dbDate
                        fldDataInfo = "date"
                     Case dbText
                        fldDataInfo = "nvarchar2(" & Format$(.Size) & ")"
                     Case dbLongBinary
                        fldDataInfo = "****"
                     Case dbMemo
                        fldDataInfo = "****"
                     Case dbGUID
                        fldDataInfo = "nvarchar2(16)"
                  End Select
               End With
               If FieldIndex > 0 Then
               DDL = DDL & ", " & vbCrLf
               End If
               DDL = DDL & "  " & fldName & " " & fldDataInfo
               Next FieldIndex
         End With
         DDL = DDL & ");"
         TableCreateDDL = DDL
End Function


Sub ExportAllTableCreateDDL()

    Dim lTbl As Long
    Dim dBase As Database
    Dim Handle As Integer

    Set dBase = CurrentDb

    Handle = FreeFile

    Open "c:\export\TableCreateDDL.txt" For Output Access Write As #Handle

    For lTbl = 0 To dBase.TableDefs.Count - 1
         'If the table name is a temporary or system table then ignore it
        If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _
        Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then
             '~ indicates a temporary table
             'MSYS indicates a system level table
        Else
          Print #Handle, TableCreateDDL(dBase.TableDefs(lTbl))
        End If
    Next lTbl
    Close Handle
    Set dBase = Nothing
End Sub

我从未声称自己是VB程序员。

您可能需要查看ADOX以获取模式信息。使用ADOX,您可以获得诸如键、视图、关系等内容


不幸的是,我不是一名VB程序员,但是在web上有很多使用ADOX获取表模式的示例。

使用Oracle的SQL Developer迁移工作台


有一个关于将Access数据库转换为Oracle的完整教程。如果这只是你想要的结构,那么你可以专注于第3.0节。

聚会有点晚,但我使用RazorSQL为Access数据库生成DDL。

@iDevlop-这是相关的,但可能我没有正确解释。最初的问题是,是否有办法创建脚本,还是必须手工编写。如果您按照我的指示操作,则可以让MS SQL Server为您生成脚本。您仍然需要手动调整以获得访问权限,但SQL Server技巧将使您达到90%。我可以想象您可以将:Case dbDecimal flddatanfo=“number”添加到Case语句中。正如我所说,我不是VB程序员。我必须使用Dim fldDef作为对象(而不是字段),以使其在Access2007中工作。您可能还需要添加模块引用,以免收到“用户定义类型未定义”错误。这是在VB编辑器中通过菜单路径工具>参考完成的。在我的例子中,需要的模块是一个“MicrosoftDAO”对象库。这是在MS Access 2016中。上述链接已断开。这可能会有帮助:这将不再有效,SQLDeveloper使用Java8,它不支持ODBC桥。是的!它起作用了。这需要一点耐心,直到您收到消息“成功导出‘tablename’”。我成功地将表导出到Sqlite3和Firebird。好吧,新表中的所有字段都没有添加“NOTNULL”约束。因此,在这两个目标数据库中,我复制了DDL,删除了表,编辑了DDL,然后用额外的约束重新创建了表。