You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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目标后,走到选择源表和视图这一步:

  1. 选中你要导出的表,点击右侧的「编辑映射」
  2. 在弹出的「列映射」窗口中,点击「高级」按钮
  3. 切换到「输入和输出属性」选项卡,找到目标输出的「数据类型映射」节点,点击「加载」按钮,选择你刚创建的MSSql10ToPostgreSQLODBC.XML
  4. 确认所有列的类型映射都正确(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:54:08