13

我需要将数据库从 Postgres 7 迁移到 SQL Server 2008。我熟悉 SSIS 导入和导出向导,但对于如何定义数据源或定义数据提供者感到困惑。

将 Postgres 迁移到 SQL Server 的最佳方法是什么,以及如何为 postgres 定义数据源/驱动程序?

4

4 回答 4

13

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

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

“计费”-> [dbo].[计费]:

– 找不到列 -1。

我在此处的 Microsoft 博客文章中找到了解决方案。显然问题在于各种 ODBC 驱动程序在报告列元数据时使用不同的属性名称。为了使导入工作,我必须编辑“ProviderDescriptors.xml”文件,该文件位于

C:\Program Files\Microsoft SQL Server\100\DTS\ProviderDescriptors\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、和。NumericPrecisionColumnNameNumericScaleColumnName"LENGTH""PRECISION""SCALE"

进行该更改后,从 PostgreSQL 到 SQL Server 的导入成功运行。

于 2016-11-18T00:16:44.207 回答
11
于 2010-09-14T16:53:04.787 回答
1

当我完成对上面答案的评论时,我想尝试SQL WorkbenchJ;它有一个数据泵功能,对我来说效果很好。我设法将数据从我的 PostgreSQL 数据库导出到 SQL 服务器实例。

那些想以批处理模式(通过 shell)运行它的人,这里是如何做到的:Google Groups Thread。讨论中提到的 WbCopy 命令在我能找到的任何地方都没有真正记录,但是您可以通过数据泵接口生成一个,然后更改您需要的任何内容。

于 2016-09-20T21:29:18.547 回答
0

举一个更实际的例子来说明如何实现标记答案中描述的内容;您可以从 PostgresQL 导出到平面文件,然后使用bcp 实用程序导入 SQL Server。例如,在 .bat 文件中,对于单个表(并且您需要已经在目标 SQL DB 中创建了表):

@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%
于 2020-09-21T04:06:58.797 回答