我需要将数据库从 Postgres 7 迁移到 SQL Server 2008。我熟悉 SSIS 导入和导出向导,但对于如何定义数据源或定义数据提供者感到困惑。
将 Postgres 迁移到 SQL Server 的最佳方法是什么,以及如何为 postgres 定义数据源/驱动程序?
我需要将数据库从 Postgres 7 迁移到 SQL Server 2008。我熟悉 SSIS 导入和导出向导,但对于如何定义数据源或定义数据提供者感到困惑。
将 Postgres 迁移到 SQL Server 的最佳方法是什么,以及如何为 postgres 定义数据源/驱动程序?
我在使用 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
、和。NumericPrecisionColumnName
NumericScaleColumnName
"LENGTH"
"PRECISION"
"SCALE"
进行该更改后,从 PostgreSQL 到 SQL Server 的导入成功运行。
当我完成对上面答案的评论时,我想尝试SQL WorkbenchJ;它有一个数据泵功能,对我来说效果很好。我设法将数据从我的 PostgreSQL 数据库导出到 SQL 服务器实例。
那些想以批处理模式(通过 shell)运行它的人,这里是如何做到的:Google Groups Thread。讨论中提到的 WbCopy 命令在我能找到的任何地方都没有真正记录,但是您可以通过数据泵接口生成一个,然后更改您需要的任何内容。
举一个更实际的例子来说明如何实现标记答案中描述的内容;您可以从 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%