SSMS 2017导出SQL Server 2008到PostgreSQL缺失映射文件求助
解决SQL Server 2008到PostgreSQL的ODBC导出数据类型映射问题
我之前帮团队处理过几乎一模一样的迁移场景,核心问题就是SSIS的默认ODBC数据类型映射文件没有适配PostgreSQL的类型规则,导致只能导出表结构没法导数据。咱们一步步来解决:
第一步:确认映射文件的位置
你说的路径C:\Program Files (x86)\Microsoft SQL Server\110\DTS\MappingFiles完全正确——SSMS 2017依赖的是SQL Server 2012版本的DTS组件(版本号110),所有类型映射文件都存在这里。先把原有的MSSql10ToODBC.XML和SSIS10ToODBC.XML做个备份,避免改错了没法恢复。
第二步:创建自定义PostgreSQL映射文件
直接修改默认的ODBC映射文件容易影响其他场景,建议咱们新建一个专门适配PostgreSQL的映射文件,命名为MSSql10ToPostgreSQLODBC.XML,把下面的内容复制进去(覆盖了常见的SQL Server到PostgreSQL的类型映射,你可以根据自己的表结构补充更多类型):
<?xml version="1.0" encoding="utf-8"?> <DataTypeMappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- 字符串类型 --> <DataTypeMapping> <SourceDataType>DT_STR</SourceDataType> <DestinationDataType>SQL_VARCHAR</DestinationDataType> <Length>0</Length> <!-- 0表示保留原长度 --> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_WSTR</SourceDataType> <DestinationDataType>SQL_WVARCHAR</DestinationDataType> <Length>0</Length> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_TEXT</SourceDataType> <DestinationDataType>SQL_LONGVARCHAR</DestinationDataType> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_NTEXT</SourceDataType> <DestinationDataType>SQL_WLONGVARCHAR</DestinationDataType> </DataTypeMapping> <!-- 数值类型 --> <DataTypeMapping> <SourceDataType>DT_INT</SourceDataType> <DestinationDataType>SQL_INTEGER</DestinationDataType> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_BIGINT</SourceDataType> <DestinationDataType>SQL_BIGINT</DestinationDataType> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_SMALLINT</SourceDataType> <DestinationDataType>SQL_SMALLINT</DestinationDataType> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_TINYINT</SourceDataType> <DestinationDataType>SQL_TINYINT</DestinationDataType> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_DECIMAL</SourceDataType> <DestinationDataType>SQL_DECIMAL</DestinationDataType> <Precision>0</Precision> <Scale>0</Scale> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_NUMERIC</SourceDataType> <DestinationDataType>SQL_NUMERIC</DestinationDataType> <Precision>0</Precision> <Scale>0</Scale> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_FLOAT</SourceDataType> <DestinationDataType>SQL_FLOAT</DestinationDataType> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_REAL</SourceDataType> <DestinationDataType>SQL_REAL</DestinationDataType> </DataTypeMapping> <!-- 日期时间类型 --> <DataTypeMapping> <SourceDataType>DT_DBTIMESTAMP</SourceDataType> <DestinationDataType>SQL_TIMESTAMP</DestinationDataType> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_DBTIME</SourceDataType> <DestinationDataType>SQL_TIME</DestinationDataType> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_DATE</SourceDataType> <DestinationDataType>SQL_DATE</DestinationDataType> </DataTypeMapping> <!-- 其他类型 --> <DataTypeMapping> <SourceDataType>DT_GUID</SourceDataType> <DestinationDataType>SQL_GUID</DestinationDataType> </DataTypeMapping> <DataTypeMapping> <SourceDataType>DT_BIT</SourceDataType> <DestinationDataType>SQL_BIT</DestinationDataType> </DataTypeMapping> </DataTypeMappings>
把这个文件保存到之前的映射文件目录里,如果保存失败,右键用管理员身份打开记事本再保存即可。
第三步:在导入导出向导中使用自定义映射
重新打开SSMS的导入导出向导,按流程配置好SQL Server源和PostgreSQL的ODBC目标后,走到选择源表和视图这一步:
- 选中你要导出的表,点击右侧的「编辑映射」
- 在弹出的「列映射」窗口中,点击「高级」按钮
- 切换到「输入和输出属性」选项卡,找到目标输出的「数据类型映射」节点,点击「加载」按钮,选择你刚创建的
MSSql10ToPostgreSQLODBC.XML - 确认所有列的类型映射都正确(比如SQL Server的
datetime对应PostgreSQL的timestamp),然后点击确定回到向导,继续完成后续步骤
额外注意事项
- 确保你的PostgreSQL ODBC驱动是Unicode版本(psqlODBC Unicode),否则处理
nvarchar等Unicode类型会出问题 - 在ODBC数据源配置里,勾选「Use Declare/Fetch」选项,避免大表导出时出现内存溢出或截断问题
- 如果有特殊类型(比如SQL Server的
hierarchyid或PostgreSQL的jsonb),需要在映射文件里手动添加对应的映射规则
如果还是遇到问题,也可以试试pgLoader这类专门的迁移工具,它会自动处理大部分类型映射,而且迁移速度比SSIS更快,但如果必须用SSMS的话,上面的方案应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Puddingloeffel
相关产品推荐
相关产品推荐

