核心提示
使用數據轉換服務(DTS)在異構數據源與目標服務器之間轉換數據前,必須了解不同提供程序、驅動程序對數據類型和 SQL 語法的支持差異。本文彙總 SQL Server 2000 環境下常見的陷阱與最佳實踐。
一、SQL Server 作為數據源
- real → int 精度損失: SQL Server 2000 的 real 僅支持 6 位精度,如 2147480000 可能轉為 2147480065。
- 文本轉日期/時間: OLE DB 僅接受
yyyy-mm-dd hh:mm:ss.fffffffff 格式,建議用 CDate 或 ActiveX 腳本轉換。
- 不支持 DBTYPE_DATE/DBTYPE_TIME: 僅支持 DBTYPE_DATETIME;多步驟訪問請用全局臨時表(##tmp)或 tempdb 永久表,避免局部臨時表(#tmp)導致存儲過程不可作為轉換源。
二、DTS 導入/導出向導與設計器
- 同一連接不能同時作為轉換的源與目標。
- 對 Access、ODBC DSN 等唯讀源,可在「高級連接屬性」將模式屬性設為 1。
- 創建目標表時,所有者為當前用戶(通常是 dbo),若同名表已存在會導致失敗。
- 數據驅動查詢要求目標支持 OLE DB ICommand 接口,純文本文件不支持。
- 大字段截斷隱患: text/ntext/image 超過 8,388,602 字節會被靜默截斷,僅在日志(..log)記錄,不報錯。
三、其他常見數據源/目標要點
Microsoft SNA Server
- AS/400、VSAM 的 OLE DB 提供程序不支持向導用於創建/截斷表的 SQL。
Microsoft Access
- 導出大量數據到 Access 97 時,提供程序在內存緩衝所有插入,易導致內存不足;解決方案:構造分批次的 SELECT 語句。
Visual FoxPro
- 僅支持 numeric(15,9) 精度,超出會截斷四捨五入;不支持 SELECT INTO,僅支持 INSERT VALUE。
- ODBC 驅動無法寫入 BLOB,因 FoxPro 不支持動態游標。
ODBC 通用
- 導出含 BLOB 列的表需唯一鍵。
- SQL Server ODBC 驅動要求 BLOB 列置於源行集末尾(向導自動處理)。
- 連接忙錯誤:將 MaxConcurrentSteps 設 1、增加 ODBC 連接、或改用 SQLOLEDB 提供程序(連 SQL 6.5 需跑 Instcatl.sql)。
Oracle
- Microsoft 驅動支持 Oracle 7.3 BLOB,不支持 8.0 的 BLOB/CLOB/NCLOB/BFILE。
- 不支持發送 Unicode 字符串(需 N 前綴);number 負縮放不支持;無精度 number 長度報 20 位,超 20 位需手動調精度。
- 單表僅支持一個 LONG 列;區分大小寫列名需精確引用;分布式事務需 Oracle 8.0.4.1+。
- OLE DB 提供程序不支持 ICommandWithParameters,不能作數據驅動查詢目標。
IBM DB2 (AS/400)
- 不支持 Unicode/BLOB;CREATE TABLE 不支持 NULL 語法(可手動編輯去除引用);假定 NOT NULL 為預設。
Sybase
- numeric(3,0) 默認映射 smallmoney,numeric(18/19,x) 映射 money,易丟失精度,需手動調整列映射。
- 向導無法刪除重建表;SQLAnywhere 每次僅能移一張表,用設計器可突破但需將 Step 的 ExecuteInMainThread 設 True。
- 含 BLOB/Image 表不可複製到 Sybase;編程複製 Image 表勿改默認 BLOB 設置。
dBase / Paradox
- 表名限 8 字符,列名限 10 字符(dBase)。
四、文件導入/導出與代碼頁/排序規則
- char/varchar 跨代碼頁會丟擴展字符;nchar/nvarchar 安全。
- BLOB 導出固定長度文本默認 2GB,易爆盤,建議用分隔格式或限制長度。
- OLE DB 文本提供程序不處理超 2MB 的 BLOB 列。
- 最佳實踐: 國際化數據請以 Unicode 存儲,避免代碼頁/排序規則不匹配導致數據損壞。
五、複製 SQL Server 對象任務與列轉換的代碼頁行為
| 場景 | 行為 |
| SQL 2000 → SQL 2000 | 啟用 UseCollation 屬性則無損 |
| SQL 2000 → SQL 7.0 | 匹配默認排序規則代碼頁的列用最佳匹配,否則按默認代碼頁解碼,有損 |
| SQL 7.0 → SQL 2000 | UseCollation 不可用,目標列獲默認排序規則,代碼頁不匹配則最佳匹配 |
| SQL 7.0 → SQL 7.0 | 不同默認代碼頁時最佳匹配 |
列轉換:源 Unicode → 目標非 Unicode(最佳匹配);源非 Unicode → 目標 Unicode(視為 1252);雙方皆非 Unicode(直接複製二進制,必損)。
結語
異構遷移細節決定成敗,建議遷移前完整測試數據類型映射、代碼頁轉換、大字段處理、約束與索引重建,並保留詳細日志以便事後審計。
- 上一篇文章: SQL 查詢結果添加自動編號的兩種實用技巧
- 下一篇文章: Oracle 與 SQL Server 預存過程調試與錯誤處理實戰指南
Copyright ©
程式碼之家 All Rights Reserved