代码之家  ›  专栏  ›  技术社区  ›  reach4thelasers

从Postgres迁移到SQL Server 2008

  •  9
  • reach4thelasers  · 技术社区  · 14 年前

    将Postgres迁移到sqlserver的最佳方法是什么?如何为Postgres定义数据源/驱动程序?

    3 回复  |  直到 14 年前
        1
  •  10
  •   JohnB    12 年前

    祝您在使用SQL Server导入和导出向导从PostgreSQL导入SQL Server时好运。然而,我读过很多留言板上的帖子,有人很难让它正常工作。例如:

    以下是我在这个主题上发现的最有用的线索:


    去帮助那些想要达到和我相似目标的人。选择.Net Framework data Provider for Odbc,而不是在SQL Server导入和导出向导的数据源下拉菜单中选择PostgreSQL OLE DB提供程序

    然后您必须创建一个DSN并提供一个ConnectionString。下面的连接字符串对我有用

    Driver={PostgreSQL};Server=localhost;Port=5432;Database=TestMasterMap;Uid=postgres;Pwd=;


    一位评论员声称这是可行的,但他在大表上“读取元组时内存不足”的错误。因此,对于超过300万行的表,他必须将导入分解为300万行块。

    另外,还有一个 link to the native .NET provider for PostgreSQL 在那条线里。

    就个人而言,如果这是我只需要做一次的事情,如果我对模式和数据理解得相当好,我会尝试:

    1. 将PostgreSQL中的数据导出为平面文件
    2. 使用SSIS导入/导出向导导入平面文件
    3. 然后创建PKs和必要的约束

    完成上述操作所需的时间可能比在SSIS导入/导出向导和PostgreSQL上乱搞几天要少 (但如果这些工具能起作用那就太好了!)

        2
  •  11
  •   Gord Thompson    8 年前

    我在使用SQLServer2008R2中的导入向导从PostgreSQL导入表时遇到问题。我安装了PostgreSQL ODBC驱动程序,因此对于导入向导中的数据源,我选择了“.Net Framework Data Provider for ODBC”,并为我的PostgreSQL数据库提供了DSN名称。向导发现表没有问题,但是当我去执行导入时出现了错误

    无法检索源和目标数据的列信息。

    计费->[dbo]。[Billing]:

    here . 很明显,问题是不同的ODBC驱动程序在报告列元数据时使用不同的属性名。为了使导入生效,我必须编辑“ProviderDescriptors.xml“文件,位于

    在。。。

    <dtm:ProviderDescriptor SourceType="System.Data.Odbc.OdbcConnection">
    

    <dtm:ColumnSchemaAttributes
        NameColumnName = "COLUMN_NAME"
        OrdinalPositionColumnName="ORDINAL_POSITION"
        DataTypeColumnName = "TYPE_NAME"
        MaximumLengthColumnName = "COLUMN_SIZE"
        NumericPrecisionColumnName = "COLUMN_SIZE"
        NumericScaleColumnName = "DECIMAL_DIGITS"
        NullableColumnName="NULLABLE"
        NumberOfColumnRestrictions="4"
    />
    

    ... 到。。。

    <dtm:ColumnSchemaAttributes
        NameColumnName = "COLUMN_NAME"
        OrdinalPositionColumnName="ORDINAL_POSITION"
        DataTypeColumnName = "TYPE_NAME"
        MaximumLengthColumnName = "LENGTH"
        NumericPrecisionColumnName = "PRECISION"
        NumericScaleColumnName = "SCALE"
        NullableColumnName="NULLABLE"
        NumberOfColumnRestrictions="4"
    />
    

    也就是说,我不得不调整 MaximumLengthColumnName , NumericPrecisionColumnName ,和 NumericScaleColumnName "LENGTH" , "PRECISION" ,和 "SCALE" 分别是。

        3
  •  1
  •   Andre    8 年前

    当我把上面的答案评论完后,我想试试 SQL WorkbenchJ ;它的数据泵功能对我来说非常有效。我设法将数据从PostgreSQL数据库导出到sqlserver实例。

    Google Groups Thread . 讨论中提到的WbCopy命令在我能找到的任何地方都没有文档记录,但是您可以通过datapump接口生成一个命令,然后根据需要进行更改。

        4
  •  0
  •   Mark Z.    4 年前

    举一个更实际的例子,说明如何实现marked answer中描述的内容;您可以将PostgresQL导出到平面文件,然后使用 bcp Utility 在SQL Server中导入。

    @echo off
    
    set DbName=YOUR_POSTGRES_DB_NAME
    set csvpath=C:\PATH_TO_CSV\CSV_NAME.csv
    set username=YOUR_POSTGRES_DB_USERNAME
    
    :: Export to CSV, note we're using a ~ delimiter to avoid issues with commas in fields
    psql -U %username% -d %DbName% -c "COPY (select * from SOURCE_TABLE_NAME) TO STDOUT (FORMAT CSV, HEADER TRUE, DELIMITER '~', ENCODING 'UTF8');" > %csvpath%
    
    :: Import CSV to SQL Server
    set logpath=C:\bcplog.txt
    set errorlogpath=C:\bcperrors.txt
    set sqlserver=YOUR_SQL_SERVER
    set sqldb=YOUR_DB_NAME
    
    :: page code 65001 = UTF-8
    bcp DESTINATION_TABLE_NAME IN %csvpath% -t~ -F1 -c -C65001 -S %sqlserver% -d %sqldb% -T -o %logpath% -e %errorlogpath%