數(shù)據(jù)變換和轉(zhuǎn)換注意事項(SQL)
2024-07-21 02:30:46
供稿:網(wǎng)友
使用數(shù)據(jù)轉(zhuǎn)換服務(wù) (DTS) 轉(zhuǎn)變或轉(zhuǎn)換異類數(shù)據(jù)和目的服務(wù)器之間的數(shù)據(jù)之前,請考慮不同程序、提供程序以及驅(qū)動程序支
持?jǐn)?shù)據(jù)類型和 SQL 語句的方式的變化。
當(dāng)使用 Microsoft® SQL Server™ 作為數(shù)據(jù)源時,請考慮下列事項:
將 real 數(shù)據(jù)類型轉(zhuǎn)換為 int 數(shù)據(jù)類型也許不能返回精確的值,因為 SQL Server 2000 只支持精確度為 6 位數(shù)字的
real 數(shù)據(jù)類型。例如,real 型數(shù)字 2147480000 可能生成 2147480065 的 int 值。
從一個文本文件將 string (DBTYPE_WSTR) 列轉(zhuǎn)換為 date (DBTYPE_DATE) 或 time (DBTYPE_TIME) 列時,OLE DB 數(shù)據(jù)轉(zhuǎn)
換服務(wù)組件只接受一種日期或時間格式 (yyyy-mm-dd hh:mm:ss.fffffffff)。使用日期時間字符串轉(zhuǎn)換,或者使用 CDate
函數(shù)編碼 Microsoft ActiveX® 腳本轉(zhuǎn)換正確地轉(zhuǎn)換日期。
SQL Server 2000 不支持 OLE DB 類型 DBTYPE_DATE 或 DBTYPE_TIME。SQL Server 2000 只支持 DBTYPE_DATETIME。
若要通過多步驟訪問數(shù)據(jù),請避免在轉(zhuǎn)換過程中使用 temp 表。應(yīng)使用全局 temp 表或在 tempdb 中創(chuàng)建永久表。
從 temp 表返回行的存儲過程不能用作轉(zhuǎn)換源。可以使用存儲過程從全局 temp 表或表返回行。
在轉(zhuǎn)換數(shù)據(jù)任務(wù)、數(shù)據(jù)驅(qū)動的查詢?nèi)蝿?wù)或 DTS 設(shè)計器中的執(zhí)行 SQL 任務(wù)中使用臨時表時,請記住:不能使用 Transact-
SQL 語句或調(diào)用 temp 表的存儲過程作為源。
該限制并不應(yīng)用于 DTS 設(shè)計器的外部。可使用通過編程方式訪問 SQL Server temp 表的源語句或存儲過程。
DTS 導(dǎo)入/導(dǎo)出向?qū)Ш?DTS 設(shè)計器
當(dāng)使用 DTS 導(dǎo)入導(dǎo)出向?qū)Ш?DTS 設(shè)計器創(chuàng)建包時,請考慮以下事項:
DTS 用戶界面允許共享任務(wù)中現(xiàn)有的連接,但是同一個連接不能既用在一個轉(zhuǎn)換的源中又用在該轉(zhuǎn)換的目的中。
使用 DTS 設(shè)計器或 DTS 導(dǎo)入/導(dǎo)出向?qū)В锌赡転橐恍┲蛔鳛閿?shù)據(jù)源的提供程序指定只讀或正在使用狀態(tài)(例如,
Microsoft access 和 ODBC DSN )。單擊"連接屬性"對話框中的"高級"選項卡,然后在"高級連接屬性"對話框中,將模式
屬性值設(shè)置為 1。
使用 DTS 導(dǎo)入/導(dǎo)出向?qū)Щ?DTS 設(shè)計器創(chuàng)建表時,在目的地上創(chuàng)建的表的所有者為當(dāng)前用戶(通常是 dbo),與誰是源表
的所有者無關(guān)。這將產(chǎn)生這種情況:dbo 試圖在目的地創(chuàng)建一個表,而該表的名稱已經(jīng)存在,從而導(dǎo)致嘗試失敗。
當(dāng)使用 DTS 設(shè)計器定義數(shù)據(jù)驅(qū)動的查詢時,數(shù)據(jù)目的地必須能夠支持 OLE DB ICommand 接口。由于這種限制,類似文本
文件的目的不被支持。
如果 text、ntext 和 image 類型的字段長度超過 8388602 字節(jié),則 DTS 的復(fù)制 SQL Server 對象任務(wù)將截斷超出的部
分。DTS 設(shè)計器或 DTS 導(dǎo)入/導(dǎo)出向?qū)Р伙@示任何錯誤信息,而是顯示任務(wù)已成功完成。
唯一的失敗指示是一條寫入日志文件的日志消息,此文件的名稱為 <server>.<database>.log,位于"復(fù)制 SQL Server 對
象任務(wù)屬性"對話框的"復(fù)制"選項卡所指定的腳本文件目錄中。此日志消息詳細(xì)說明表和列,但不指出發(fā)生截斷的行。無任
何錯誤記錄寫入 DTS 錯誤文件或 SQL Server 日志。
Microsoft SNA Server
當(dāng)使用 Microsoft SNA Server 作為數(shù)據(jù)源時,請考慮下列事項:
AS/400 和 VSAM 的 Microsoft OLE DB 提供程序不支持 DTS 導(dǎo)入/導(dǎo)出向?qū)в脕韯?chuàng)建或截斷表的 SQL 語句。
Microsoft Access
使用 Access 時,應(yīng)考慮下列事項:
當(dāng)從 SQL Server 2000 中將數(shù)據(jù)導(dǎo)出到 Microsoft Access 97 或更早的版本中,Access 的 Microsoft OLE DB 提供程序
在內(nèi)存中為所有插入設(shè)置緩沖區(qū),并且只在 DTS 導(dǎo)入/導(dǎo)出向?qū)瓿刹僮鲿r提交它們。結(jié)果是,可以在導(dǎo)出大量表時,面
對內(nèi)存較小的形勢。然而,可以通過構(gòu)造在多個傳遞中發(fā)送較少行數(shù)的 SELECT 語句解決該問題。
Microsoft Visual FoxPRo
Microsoft Visual FoxPro® 只支持 numeric 數(shù)據(jù)類型的 (15,9) 精度。如果導(dǎo)出到 Visual FoxPro 的數(shù)據(jù)超出該精
度,則會被截斷并四舍五入。
Visual FoxPro 不支持 SELECT INTO 語句。
DTS 查詢設(shè)計器支持 Visual FoxPro INSERT VALUE 語句,但不支持使用 SELECT 語句的 INSERT 語句。
ODBC 的 Microsoft OLE DB 驅(qū)動程序無法使用 FoxPro ODBC 驅(qū)動程序?qū)?BLOB 寫入 Visual FoxPro,因為 Visual
FoxPro 不支持動態(tài)游標(biāo)。
ODBC
當(dāng)連接到 ODBC 數(shù)據(jù)源時,請考慮下列事項:
ODBC 的 Microsoft OLE DB 提供程序在執(zhí)行導(dǎo)出操作時需要一個在帶有 BLOB 數(shù)據(jù)列的所有目標(biāo)表上的唯一鍵。
當(dāng)使用帶有 SQL Server ODBC 驅(qū)動程序的 ODBC 的 Microsoft OLE DB 提供程序時,在安排帶有源行集中其它數(shù)據(jù)類型的
列之后安排所有 BLOB 列。可以使用 SELECT 語句重新將 BLOB 列安排到源行集的末尾。DTS 導(dǎo)入/導(dǎo)出向?qū)ё詣拥貓?zhí)行該
操作。
重要 當(dāng)使用帶有 SQL Server ODBC 驅(qū)動程序的 ODBC 的 Microsoft OLE DB 提供程序時,請嘗試預(yù)覽帶有連接忙錯誤的
存儲過程失敗。如果使用 SQL Server 的 Microsoft OLE DB 提供程序,該問題就不會發(fā)生。
如果一個用于 SQL Server 的 Microsoft ODBC 驅(qū)動程序連接由多個線程共享,此連接可能會失敗,并返回錯誤信
息"Connection is busy with results for another hstmt"(此連接正忙于其它 hstmt 的結(jié)果)。在某些情況下,這將
影響通過 DTS 導(dǎo)入/導(dǎo)出向?qū)傻陌J褂靡韵路椒ㄖ唤鉀Q此問題:
將 MaxConcurrentSteps 屬性設(shè)置為1 以消除競爭的線程。
創(chuàng)建其它的 ODBC 連接以消除連接共享。
使用用于 SQL Server 的 Microsoft OLE DB 提供程序 (SQLOLEDB) 連接數(shù)據(jù)庫。如果需要連接 SQL Server 6.5 數(shù)據(jù)
庫,則運行 Instcatl.sql 以啟用通過用于 SQL Server 的 Microsoft OLE DB 提供程序進行訪問。
Oracle
當(dāng)使用 Oracle 作為數(shù)據(jù)源時,請考慮以下事項:
用于 Oracle 的 Microsoft ODBC 和 OLEDB 驅(qū)動程序支持 Oracle 7.3 BLOB 數(shù)據(jù)類型,不支持 Oracle 8.0 數(shù)據(jù)類型。
例如,不支持 BLOB、CLOB、NCLOB 和 BFILE。
用于 Oracle 的 Microsoft OBDC 驅(qū)動程序不支持將 Unicode 字符串發(fā)送到 Oracle 服務(wù)器中。Oracle 要求在 Unicode
字符串前加上前綴字母 N。
用于 Oracle 的 Microsoft OBDC 驅(qū)動程序不支持 Oracle number 數(shù)據(jù)類型的負(fù)向縮放。
用于 Oracle 的 Microsoft OBDC 驅(qū)動程序報告無指定精度的 Oracle number 數(shù)據(jù)類型的長度為 20 位數(shù)字。當(dāng)從
Oracle (不考慮目的)中導(dǎo)入時,如果有多于 20 位的數(shù)字,并且如果目的表還不存在,可能必須手工地增加精度。
在表中 Oracle 僅支持一個 LONG (BLOB) 數(shù)據(jù)列。
不能導(dǎo)入或?qū)С鰮碛谢旌匣蛐懨Q的 Oracle 列。也不能通過使用 Oracle 列名稱(包含使用 DTS 導(dǎo)入/導(dǎo)出向?qū)У目?br>格)來轉(zhuǎn)換或復(fù)制數(shù)據(jù)。Oracle 要求精確指定并引用區(qū)分大小寫的列名稱。
若要在 SQL Server 2000 和 Oracle 之間執(zhí)行分布式事務(wù),必須使用 Oracle 8.0.4.1 版本或更新版本。有關(guān)更多信息,
請參見分布式事務(wù)。
由于用于 Oracle 的 Microsoft OLE DB 提供程序不支持 IcommandWithParameters,所以它不能用作數(shù)據(jù)驅(qū)動的查詢?nèi)蝿?wù)
的目的地。在 DTS 設(shè)計器中使用此提供程序時,轉(zhuǎn)換數(shù)據(jù)任務(wù)、數(shù)據(jù)驅(qū)動的查詢?nèi)蝿?wù)以及執(zhí)行 SQL 任務(wù)上的"參數(shù)"按鈕
將被禁用。
IBM AS/400 上的 DB2
當(dāng)連接到 DB2 數(shù)據(jù)源時,請考慮以下事項:
在 AS/400 系統(tǒng)上不支持 Unicode 或 BLOB。
在 AS/400 服務(wù)器上不能轉(zhuǎn)換任何有 NULL 列值的表,因為 AS/400 在其 CREATE TABLE 語句中不支持 NULL 語法。然
而,如果編輯 CREATE TABLE 語法以清除對 NULL 的引用時,則可以發(fā)送 NULL 值。AS/400 不支持 NOT NULL;如果沒指
定就假定為 NULL。
使用 Sybase ODBC 驅(qū)動程序
當(dāng)連接到一個 Sybase ODBC 數(shù)據(jù)源時,請考慮以下事項:
當(dāng)使用 DTS 導(dǎo)入/導(dǎo)出向?qū)?shù)據(jù)從 SQL Server 轉(zhuǎn)換到 Sybase 11 版本時:
默認(rèn)情況下,SQL Server numeric (3,0) 數(shù)據(jù)類型映射為 Sybase smallmoney。為避免數(shù)據(jù)丟失,請更改此設(shè)置。
默認(rèn)情況下,SQL Server numeric (18,x 或 19,x) 數(shù)據(jù)類型映射為 Sybase money 數(shù)據(jù)類型。為避免數(shù)據(jù)丟失,請更改
此設(shè)置。
將數(shù)據(jù)移動到一個新的 Sybase 表時,如果單擊了"列映射和轉(zhuǎn)換"對話框中的"確定"按鈕,向?qū)祷劐e誤信息"表已存
在"。應(yīng)該忽略此消息。
不能使用 DTS 導(dǎo)入/導(dǎo)出向?qū)Сゲ⑶抑匦聞?chuàng)建 Sybase 表。必須不使用向?qū)韴?zhí)行此操作。
DTS 查詢設(shè)計器不支持 Sybase SQLAnywhere CREATE TABLE 語句。
由于 SQLAnywhere 驅(qū)動程序中的限制,DTS 導(dǎo)入/導(dǎo)出向?qū)看沃荒軐⒁粋€表移動到 SQLAnywhere 數(shù)據(jù)庫。可以使用
DTS 設(shè)計器來克服此限制。然而,因為 SQLAnywhere 驅(qū)動程序不是安全線程,所以,必須將每個表的 Step 對象的
ExecuteInMainThread 屬性設(shè)置為 True。
如果表中包含 BLOB 列,則不能將此表復(fù)制到 Sybase 目的中。
如果通過編程方式從 Sybase 中復(fù)制一個包含 image 數(shù)據(jù)類型的表,則更改默認(rèn)的 BLOB 設(shè)置會導(dǎo)致失敗。
dBase 和 Paradox
當(dāng)連接到 dBase 和 Paradox 數(shù)據(jù)源時,請考慮以下事項:
dBase 和 Paradox 中的表名稱被限制為八個字符。dBase 中的列名稱被限制為 10 個字符。
文件導(dǎo)入或?qū)С?br>當(dāng)從文本文件導(dǎo)入或?qū)С鰯?shù)據(jù)時,請考慮以下事項:
在 char 或 varchar 列中導(dǎo)入或?qū)С鰯?shù)據(jù)時,如果客戶端 OEM 代碼頁與服務(wù)器上的代碼頁不同,則某些擴展字符可能不
被復(fù)制。在 nchar 或 nvarchar 列中導(dǎo)入或?qū)С鰯?shù)據(jù)時,所有字符均能正確復(fù)制。
如果將 BLOB(包括 SQL Server 的 text 和 ntext 數(shù)據(jù)類型)列導(dǎo)出到固定長度的文本字段中,則將默認(rèn)長度設(shè)置為
BLBO 字段的最大長度(大約 2GB)。通過選擇較小的但足夠的字段長度來防止磁盤溢出,或者在可能的時候使用分隔格
式。
DTS 中使用的用于文本文件的 OLE DB 提供程序不能處理超過兩兆字節(jié) (MB) 的 BLOB 數(shù)據(jù)列。
代碼頁、排序規(guī)則和非 Unicode 數(shù)據(jù)問題
使用 DTS 在具有不同代碼頁和排序規(guī)則的 SQL Server 數(shù)據(jù)庫間復(fù)制數(shù)據(jù)時,數(shù)據(jù)可能會丟失或轉(zhuǎn)換不正確。
為避免出現(xiàn)轉(zhuǎn)換問題,應(yīng)以 Unicode 形式存儲國際數(shù)據(jù)。一旦轉(zhuǎn)換為 Unicode 后,便可很容易地將任何排序規(guī)則或代碼
頁中的數(shù)據(jù)傳送到任何 Microsoft SQL Server 2000 或 Microsoft SQL Server 7.0 數(shù)據(jù)庫,而不會出現(xiàn)數(shù)據(jù)丟失或轉(zhuǎn)換
不正確這類問題。
在 Microsoft SQL Server 2000 中,排序規(guī)則與具體的代碼頁相關(guān)聯(lián)并被指派給各個列。(Microsoft SQL Server 7.0
使用單個的默認(rèn)代碼頁且不支持列級排序規(guī)則)。如果用于源列和目的列的代碼頁匹配,則非 Unicode 列不會發(fā)生數(shù)據(jù)丟
失。在非 Unicode 列間復(fù)制數(shù)據(jù)時,如果源列與目的列不匹配,則將發(fā)生數(shù)據(jù)丟失。在某些情況下,DTS 執(zhí)行最佳的匹配
映射。如果源代碼頁包含的字符在目的代碼頁中未出現(xiàn),則將發(fā)生數(shù)據(jù)丟失。此外,DTS 執(zhí)行復(fù)制時不需要任何轉(zhuǎn)換干
預(yù),這將導(dǎo)致在兩個代碼頁中不是由同一個二進制值表示的數(shù)據(jù)丟失。下面的問題及準(zhǔn)則分別針對使用復(fù)制 SQL Server
對象任務(wù)的情況,和使用復(fù)制列轉(zhuǎn)換在不同排序規(guī)則或代碼頁之間復(fù)制數(shù)據(jù)的情況。
復(fù)制 SQL Server 對象任務(wù)
下面論述復(fù)制 SQL Server 對象任務(wù)如何處理非 Unicode 數(shù)據(jù):
在 SQL Server 2000 實例間復(fù)制數(shù)據(jù)時,只要設(shè)置復(fù)制 SQL Server 對象任務(wù)的 UseCollation 屬性,便不會發(fā)生數(shù)據(jù)丟
失。
將數(shù)據(jù)從 SQL Server 2000 實例復(fù)制到 SQL Server 7.0 時,對于具有與數(shù)據(jù)庫默認(rèn)排序規(guī)則代碼頁相匹配的排序規(guī)則的
列,使用最佳匹配映射。而具有不同代碼頁的列中所存儲的數(shù)據(jù),則被解釋為正在用默認(rèn)代碼頁進行編碼處理,轉(zhuǎn)換過程
中將伴隨數(shù)據(jù)丟失。
將數(shù)據(jù)從 SQL Server 7.0 復(fù)制到SQL Server 2000 實例時,由于 SQL Server 7.0 無法確定其默認(rèn)代碼頁所映射的排序
規(guī)則,UseCollation 屬性不可用。執(zhí)行復(fù)制 SQL Server 對象任務(wù)期間不支持任何排序規(guī)則,因此,將給非 Unicode 目
的列指派目的數(shù)據(jù)庫的默認(rèn)排序規(guī)則。如果與此排序規(guī)則相關(guān)聯(lián)的代碼頁與源數(shù)據(jù)庫的代碼頁不匹配,DTS 將執(zhí)行最佳匹
配映射。
將數(shù)據(jù)從 SQL Server 7.0 復(fù)制到 SQL Server 7.0 時,如果源數(shù)據(jù)庫和目的數(shù)據(jù)庫使用不同的默認(rèn)代碼頁,DTS 將執(zhí)行
最佳匹配映射。
若要確保復(fù)制非 Unicode 時不發(fā)生數(shù)據(jù)丟失,可使用 SQL Server 大容量復(fù)制功能以 Unicode 格式導(dǎo)出數(shù)據(jù),然后使用
大容量復(fù)制或 DTS 導(dǎo)入數(shù)據(jù)。
若要禁用默認(rèn)排序規(guī)則腳本,請?zhí)砑哟a或使用脫接編輯或動態(tài)屬性任務(wù)將 SQLDMOScript2_70Only 的值添加到復(fù)制 SQL
Server 對象任務(wù)的 ScriptOptionEx 屬性中。
復(fù)制列轉(zhuǎn)換
下面論述復(fù)制列轉(zhuǎn)換如何在不同代碼頁之間處理非 Unicode 數(shù)據(jù):
如果源列為 Unicode 而目的列為非 Unicode,則執(zhí)行最佳匹配映射,并嘗試在源列和目的列之間轉(zhuǎn)換數(shù)據(jù)。
如果源列為非 Unicode 而目的列為 Unicode,則不論實際使用的代碼頁是什么,DTS 都將源列視為屬于代碼頁 1252。
如果源列和目的列都為非 Unicode,原始數(shù)據(jù)不經(jīng)轉(zhuǎn)換即被復(fù)制,將發(fā)生部分?jǐn)?shù)據(jù)丟失。