使用數據轉換服務 (DTS) 轉變或轉換異類數據和目的服務器之間的數據之前,請考慮不同程序、提供程序以及驅動程序支持數據類型和 SQL 語句的方式的變化。
當使用 Microsoft® SQL Server™ 作為數據源時,請考慮下列事項:
將 real 數據類型轉換為 int 數據類型也許不能返回精確的值,因為 SQL Server 2000 只支持精確度為 6 位數字的real 數據類型。例如,real 型數字 2147480000 可能生成 2147480065 的 int 值。
從一個文本文件將 string (DBTYPE_WSTR) 列轉換為 date (DBTYPE_DATE) 或 time (DBTYPE_TIME) 列時,OLE DB 數據轉換服務組件只接受一種日期或時間格式 (yyyy-mm-dd hh:mm:ss.fffffffff)。使用日期時間字符串轉換,或者使用 CDate 函數編碼 Microsoft ActiveX® 腳本轉換正確地轉換日期。
SQL Server 2000 不支持 OLE DB 類型 DBTYPE_DATE 或 DBTYPE_TIME。SQL Server 2000 只支持 DBTYPE_DATETIME。 若要通過多步驟訪問數據,請避免在轉換過程中使用 temp 表。應使用全局 temp 表或在 tempdb 中創建永久表。
從 temp 表返回行的存儲過程不能用作轉換源。可以使用存儲過程從全局 temp 表或表返回行。在轉換數據任務、數據驅動的查詢任務或 DTS 設計器中的執行 SQL 任務中使用臨時表時,請記住:不能使用 Transact-SQL 語句或調用 temp 表的存儲過程作為源。 該限制並不應用於 DTS 設計器的外部。可使用通過編程方式訪問 SQL Server temp 表的源語句或存儲過程。
DTS 導入/導出向導和 DTS 設計器
當使用 DTS 導入導出向導和 DTS 設計器創建包時,請考慮以下事項:
DTS 用戶界面允許共享任務中現有的連接,但是同一個連接不能既用在一個轉換的源中又用在該轉換的目的中。
使用 DTS 設計器或 DTS 導入/導出向導,有可能為一些只作為數據源的提供程序指定只讀或正在使用狀態(例如,Microsoft Access 和 ODBC DSN )。單擊"連接屬性"對話框中的"高級"選項卡,然後在"高級連接屬性"對話框中,將模式屬性值設置為 1。
使用 DTS 導入/導出向導或 DTS 設計器創建表時,在目的地上創建的表的所有者為當前用戶(通常是 dbo),與誰是源表的所有者無關。這將產生這種情況:dbo 試圖在目的地創建一個表,而該表的名稱已經存在,從而導致嘗試失敗。
當使用 DTS 設計器定義數據驅動的查詢時,數據目的地必須能夠支持 OLE DB ICommand 接口。由於這種限制,類似文本文件的目的不被支持。
如果 text、ntext 和 image 類型的字段長度超過 8388602 字節,則 DTS 的復制 SQL Server 對象任務將截斷超出的部分。DTS 設計器或 DTS 導入/導出向導不顯示任何錯誤信息,而是顯示任務已成功完成。 唯一的失敗指示是一條寫入日志文件的日志消息,此文件的名稱為
Microsoft SNA Server
當使用 Microsoft SNA Server 作為數據源時,請考慮下列事項:
AS/400 和 VSAM 的 Microsoft OLE DB 提供程序不支持 DTS 導入/導出向導用來創建或截斷表的 SQL 語句。
Microsoft Access使用 Access 時,應考慮下列事項:
當從 SQL Server 2000 中將數據導出到 Microsoft Access 97 或更早的版本中,Access 的 Microsoft OLE DB 提供程序在內存中為所有插入設置緩沖區,並且只在 DTS 導入/導出向導完成操作時提交它們。結果是,可以在導出大量表時,面對內存較小的形勢。然而,可以通過構造在多個傳遞中發送較少行數的 SELECT 語句解決該問題。
使用數據轉換服務 (DTS) 轉變或轉換異類數據和目的服務器之間的數據之前,請考慮不同程序、提供程序以及驅動程序支持數據類型和 SQL 語句的方式的變化。
當使用 Microsoft® SQL Server™ 作為數據源時,請考慮下列事項:
將 real 數據類型轉換為 int 數據類型也許不能返回精確的值,因為 SQL Server 2000 只支持精確度為 6 位數字的real 數據類型。例如,real 型數字 2147480000 可能生成 2147480065 的 int 值。
從一個文本文件將 string (DBTYPE_WSTR) 列轉換為 date (DBTYPE_DATE) 或 time (DBTYPE_TIME) 列時,OLE DB 數據轉換服務組件只接受一種日期或時間格式 (yyyy-mm-dd hh:mm:ss.fffffffff)。使用日期時間字符串轉換,或者使用 CDate 函數編碼 Microsoft ActiveX® 腳本轉換正確地轉換日期。
SQL Server 2000 不支持 OLE DB 類型 DBTYPE_DATE 或 DBTYPE_TIME。SQL Server 2000 只支持 DBTYPE_DATETIME。 若要通過多步驟訪問數據,請避免在轉換過程中使用 temp 表。應使用全局 temp 表或在 tempdb 中創建永久表。
從 temp 表返回行的存儲過程不能用作轉換源。可以使用存儲過程從全局 temp 表或表返回行。在轉換數據任務、數據驅動的查詢任務或 DTS 設計器中的執行 SQL 任務中使用臨時表時,請記住:不能使用 Transact-SQL 語句或調用 temp 表的存儲過程作為源。 該限制並不應用於 DTS 設計器的外部。可使用通過編程方式訪問 SQL Server temp 表的源語句或存儲過程。
DTS 導入/導出向導和 DTS 設計器
當使用 DTS 導入導出向導和 DTS 設計器創建包時,請考慮以下事項:
DTS 用戶界面允許共享任務中現有的連接,但是同一個連接不能既用在一個轉換的源中又用在該轉換的目的中。
使用 DTS 設計器或 DTS 導入/導出向導,有可能為一些只作為數據源的提供程序指定只讀或正在使用狀態(例如,Microsoft Access 和 ODBC DSN )。單擊"連接屬性"對話框中的"高級"選項卡,然後在"高級連接屬性"對話框中,將模式屬性值設置為 1。
使用 DTS 導入/導出向導或 DTS 設計器創建表時,在目的地上創建的表的所有者為當前用戶(通常是 dbo),與誰是源表的所有者無關。這將產生這種情況:dbo 試圖在目的地創建一個表,而該表的名稱已經存在,從而導致嘗試失敗。
當使用 DTS 設計器定義數據驅動的查詢時,數據目的地必須能夠支持 OLE DB ICommand 接口。由於這種限制,類似文本文件的目的不被支持。
如果 text、ntext 和 image 類型的字段長度超過 8388602 字節,則 DTS 的復制 SQL Server 對象任務將截斷超出的部分。DTS 設計器或 DTS 導入/導出向導不顯示任何錯誤信息,而是顯示任務已成功完成。 唯一的失敗指示是一條寫入日志文件的日志消息,此文件的名稱為
Microsoft SNA Server
當使用 Microsoft SNA Server 作為數據源時,請考慮下列事項:
AS/400 和 VSAM 的 Microsoft OLE DB 提供程序不支持 DTS 導入/導出向導用來創建或截斷表的 SQL 語句。
Microsoft Access使用 Access 時,應考慮下列事項:
當從 SQL Server 2000 中將數據導出到 Microsoft Access 97 或更早的版本中,Access 的 Microsoft OLE DB 提供程序在內存中為所有插入設置緩沖區,並且只在 DTS 導入/導出向導完成操作時提交它們。結果是,可以在導出大量表時,面對內存較小的形勢。然而,可以通過構造在多個傳遞中發送較少行數的 SELECT 語句解決該問題。
Microsoft Visual FoxPro
Microsoft Visual FoxPro® 只支持 numeric 數據類型的 (15,9) 精度。如果導出到 Visual FoxPro 的數據超出該精度,則會被截斷並四捨五入。 Visual FoxPro 不支持 SELECT INTO 語句。DTS 查詢設計器支持 Visual FoxPro INSERT VALUE 語句,但不支持使用 SELECT 語句的 INSERT 語句。
ODBC 的 Microsoft OLE DB 驅動程序無法使用 FoxPro ODBC 驅動程序將 BLOB 寫入 Visual FoxPro,因為 Visual FoxPro 不支持動態游標。
ODBC
當連接到 ODBC 數據源時,請考慮下列事項:
ODBC 的 Microsoft OLE DB 提供程序在執行導出操作時需要一個在帶有 BLOB 數據列的所有目標表上的唯一鍵。
當使用帶有 SQL Server ODBC 驅動程序的 ODBC 的 Microsoft OLE DB 提供程序時,在安排帶有源行集中其它數據類型的列之後安排所有 BLOB 列。可以使用 SELECT 語句重新將 BLOB 列安排到源行集的末尾。DTS 導入/導出向導自動地執行該操作。
重要當使用帶有 SQL Server ODBC 驅動程序的 ODBC 的 Microsoft OLE DB 提供程序時,請嘗試預覽帶有連接忙錯誤的存儲過程失敗。如果使用 SQL Server 的 Microsoft OLE DB 提供程序,該問題就不會發生。如果一個用於 SQL Server 的 Microsoft ODBC 驅動程序連接由多個線程共享,此連接可能會失敗,並返回錯誤信息"Connection is busy with results for another hstmt"(此連接正忙於其它 hstmt 的結果)。在某些情況下,這將影響通過 DTS 導入/導出向導生成的包。使用以下方法之一解決此問題:
將 MaxConcurrentSteps 屬性設置為1 以消除競爭的線程。
創建其它的 ODBC 連接以消除連接共享。
使用用於 SQL Server 的 Microsoft OLE DB 提供程序 (SQLOLEDB) 連接數據庫。如果需要連接 SQL Server 6.5 數據庫,則運行 Instcatl.sql 以啟用通過用於 SQL Server 的 Microsoft OLE DB 提供程序進行訪問。
Oracle
當使用 Oracle 作為數據源時,請考慮以下事項:
用於 Oracle 的 Microsoft ODBC 和 OLEDB 驅動程序支持 Oracle 7.3 BLOB 數據類型,不支持 Oracle 8.0 數據類型。例如,不支持 BLOB、CLOB、NCLOB 和 BFILE。
用於 Oracle 的 Microsoft OBDC 驅動程序不支持將 Unicode 字符串發送到 Oracle 服務器中。Oracle 要求在 Unicode 字符串前加上前綴字母 N。
用於 Oracle 的 Microsoft OBDC 驅動程序不支持 Oracle number 數據類型的負向縮放。用於 Oracle 的 Microsoft OBDC 驅動程序報告無指定精度的 Oracle number 數據類型的長度為 20 位數字。當從
Oracle (不考慮目的)中導入時,如果有多於 20 位的數字,並且如果目的表還不存在,可能必須手工地增加精度。在表中 Oracle 僅支持一個 LONG (BLOB) 數據列。 不能導入或導出擁有混合或小寫名稱的 Oracle 列。也不能通過使用 Oracle 列名稱(包含使用 DTS 導入/導出向導的空格)來轉換或復制數據。Oracle 要求精確指定並引用區分大小寫的列名稱。若要在 SQL Server 2000 和 Oracle 之間執行分布式事務,必須使用 Oracle 8.0.4.1 版本或更新版本。有關更多信息,請參見分布式事務。
由於用於 Oracle 的 Microsoft OLE DB 提供程序不支持 IcommandWithParameters,所以它不能用作數據驅動的查詢任務的目的地。在 DTS 設計器中使用此提供程序時,轉換數據任務、數據驅動的查詢任務以及執行 SQL 任務上的"參數"按鈕將被禁用。
IBM AS/400 上的 DB2
當連接到 DB2 數據源時,請考慮以下事項:
在 AS/400 系統上不支持 Unicode 或 BLOB。在 AS/400 服務器上不能轉換任何有 NULL 列值的表,因為 AS/400 在其 CREATE TABLE 語句中不支持 NULL 語法。然而,如果編輯 CREATE TABLE 語法以清除對 NULL 的引用時,則可以發送 NULL 值。AS/400 不支持 NOT NULL;如果沒指定就假定為 NULL。
使用 Sybase ODBC 驅動程序當連接到一個 Sybase ODBC 數據源時,請考慮以下事項:
當使用 DTS 導入/導出向導將數據從 SQL Server 轉換到 Sybase 11 版本時:默認情況下,SQL Server numeric (3,0) 數據類型映射為 Sybase smallmoney。為避免數據丟失,請更改此設置。默認情況下,SQL Server numeric (18,x 或 19,x) 數據類型映射為 Sybase money 數據類型。為避免數據丟失,請更改此設置。將數據移動到一個新的 Sybase 表時,如果單擊了"列映射和轉換"對話框中的"確定"按鈕,向導會返回錯誤信息"表已存在"。應該忽略此消息。
不能使用 DTS 導入/導出向導除去並且重新創建 Sybase 表。必須不使用向導來執行此操作。DTS 查詢設計器不支持 Sybase SQLAnywhere CREATE TABLE 語句。由於 SQLAnywhere 驅動程序中的限制,DTS 導入/導出向導每次只能將一個表移動到 SQLAnywhere 數據庫。可以使用DTS 設計器來克服此限制。然而,因為 SQLAnywhere 驅動程序不是安全線程,所以,必須將每個表的 Step 對象的
ExecuteInMainThread 屬性設置為 True。如果表中包含 BLOB 列,則不能將此表復制到 Sybase 目的中。如果通過編程方式從 Sybase 中復制一個包含 image 數據類型的表,則更改默認的 BLOB 設置會導致失敗。
DBase 和 Paradox
當連接到 DBase 和 Paradox 數據源時,請考慮以下事項:
dBase 和 Paradox 中的表名稱被限制為八個字符。DBase 中的列名稱被限制為 10 個字符。
文件導入或導出
當從文本文件導入或導出數據時,請考慮以下事項:
在 char 或 varchar 列中導入或導出數據時,如果客戶端 OEM 代碼頁與服務器上的代碼頁不同,則某些擴展字符可能不被復制。在 nchar 或 nvarchar 列中導入或導出數據時,所有字符均能正確復制。
如果將 BLOB(包括 SQL Server 的 text 和 ntext 數據類型)列導出到固定長度的文本字段中,則將默認長度設置為 BLBO 字段的最大長度(大約 2GB)。通過選擇較小的但足夠的字段長度來防止磁盤溢出,或者在可能的時候使用分隔格式。
DTS 中使用的用於文本文件的 OLE DB 提供程序不能處理超過兩兆字節 (MB) 的 BLOB 數據列。代碼頁、排序規則和非 Unicode 數據問題使用 DTS 在具有不同代碼頁和排序規則的 SQL Server 數據庫間復制數據時,數據可能會丟失或轉換不正確。
為避免出現轉換問題,應以 Unicode 形式存儲國際數據。一旦轉換為 Unicode 後,便可很容易地將任何排序規則或代碼頁中的數據傳送到任何 Microsoft SQL Server 2000 或 Microsoft SQL Server 7.0 數據庫,而不會出現數據丟失或轉換不正確這類問題。 在 Microsoft SQL Server 2000 中,排序規則與具體的代碼頁相關聯並被指派給各個列。(Microsoft SQL Server 7.0 使用單個的默認代碼頁且不支持列級排序規則)。如果用於源列和目的列的代碼頁匹配,則非 Unicode 列不會發生數據丟失。在非 Unicode 列間復制數據時,如果源列與目的列不匹配,則將發生數據丟失。在某些情況下,DTS 執行最佳的匹配映射。如果源代碼頁包含的字符在目的代碼頁中未出現,則將發生數據丟失。此外,DTS 執行復制時不需要任何轉換干預,這將導致在兩個代碼頁中不是由同一個二進制值表示的數據丟失。下面的問題及准則分別針對使用復制 SQL Server 對象任務的情況,和使用復制列轉換在不同排序規則或代碼頁之間復制數據的情況。
復制 SQL Server 對象任務
下面論述復制 SQL Server 對象任務如何處理非 Unicode 數據:
在 SQL Server 2000 實例間復制數據時,只要設置復制 SQL Server 對象任務的 UseCollation 屬性,便不會發生數據丟失。
將數據從 SQL Server 2000 實例復制到 SQL Server 7.0 時,對於具有與數據庫默認排序規則代碼頁相匹配的排序規則的列,使用最佳匹配映射。而具有不同代碼頁的列中所存儲的數據,則被解釋為正在用默認代碼頁進行編碼處理,轉換過程中將伴隨數據丟失。
將數據從 SQL Server 7.0 復制到SQL Server 2000 實例時,由於 SQL Server 7.0 無法確定其默認代碼頁所映射的排序規則,UseCollation 屬性不可用。執行復制 SQL Server 對象任務期間不支持任何排序規則,因此,將給非 Unicode 目的列指派目的數據庫的默認排序規則。如果與此排序規則相關聯的代碼頁與源數據庫的代碼頁不匹配,DTS 將執行最佳匹配映射。
將數據從 SQL Server 7.0 復制到 SQL Server 7.0 時,如果源數據庫和目的數據庫使用不同的默認代碼頁,DTS 將執行最佳匹配映射。 若要確保復制非 Unicode 時不發生數據丟失,可使用 SQL Server 大容量復制功能以 Unicode 格式導出數據,然後使用大容量復制或 DTS 導入數據。
若要禁用默認排序規則腳本,請添加代碼或使用脫接編輯或動態屬性任務將 SQLDMOScript2_70Only 的值添加到復制 SQL Server 對象任務的 ScriptOptionEx 屬性中。
復制列轉換
下面論述復制列轉換如何在不同代碼頁之間處理非 Unicode 數據:
如果源列為 Unicode 而目的列為非 Unicode,則執行最佳匹配映射,並嘗試在源列和目的列之間轉換數據。如果源列為非 Unicode 而目的列為 Unicode,則不論實際使用的代碼頁是什麼,DTS 都將源列視為屬於代碼頁 1252。如果源列和目的列都為非 Unicode,原始數據不經轉換即被復制,將發生部分數據丟失。