數(shù)據(jù)變換和轉(zhuǎn)換注意事項(xiàng)(SQL)
2024-07-21 02:10:52
供稿:網(wǎng)友
使用數(shù)據(jù)轉(zhuǎn)換服務(wù) (dts) 轉(zhuǎn)變或轉(zhuǎn)換異類數(shù)據(jù)和目的服務(wù)器之間的數(shù)據(jù)之前,請(qǐng)考慮不同程序、提供程序以及驅(qū)動(dòng)程序支
持?jǐn)?shù)據(jù)類型和 sql 語句的方式的變化。
當(dāng)使用 microsoft® sql server™ 作為數(shù)據(jù)源時(shí),請(qǐng)考慮下列事項(xiàng):
將 real 數(shù)據(jù)類型轉(zhuǎn)換為 int 數(shù)據(jù)類型也許不能返回精確的值,因?yàn)?sql server 2000 只支持精確度為 6 位數(shù)字的
real 數(shù)據(jù)類型。例如,real 型數(shù)字 2147480000 可能生成 2147480065 的 int 值。
從一個(gè)文本文件將 string (dbtype_wstr) 列轉(zhuǎn)換為 date (dbtype_date) 或 time (dbtype_time) 列時(shí),ole db 數(shù)據(jù)轉(zhuǎn)
換服務(wù)組件只接受一種日期或時(shí)間格式 (yyyy-mm-dd hh:mm:ss.fffffffff)。使用日期時(shí)間字符串轉(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ù),請(qǐng)避免在轉(zhuǎn)換過程中使用 temp 表。應(yīng)使用全局 temp 表或在 tempdb 中創(chuàng)建永久表。
從 temp 表返回行的存儲(chǔ)過程不能用作轉(zhuǎn)換源。可以使用存儲(chǔ)過程從全局 temp 表或表返回行。
在轉(zhuǎn)換數(shù)據(jù)任務(wù)、數(shù)據(jù)驅(qū)動(dòng)的查詢?nèi)蝿?wù)或 dts 設(shè)計(jì)器中的執(zhí)行 sql 任務(wù)中使用臨時(shí)表時(shí),請(qǐng)記住:不能使用 transact-
sql 語句或調(diào)用 temp 表的存儲(chǔ)過程作為源。
該限制并不應(yīng)用于 dts 設(shè)計(jì)器的外部。可使用通過編程方式訪問 sql server temp 表的源語句或存儲(chǔ)過程。
dts 導(dǎo)入/導(dǎo)出向?qū)Ш?dts 設(shè)計(jì)器
當(dāng)使用 dts 導(dǎo)入導(dǎo)出向?qū)Ш?dts 設(shè)計(jì)器創(chuàng)建包時(shí),請(qǐng)考慮以下事項(xiàng):
dts 用戶界面允許共享任務(wù)中現(xiàn)有的連接,但是同一個(gè)連接不能既用在一個(gè)轉(zhuǎn)換的源中又用在該轉(zhuǎn)換的目的中。
使用 dts 設(shè)計(jì)器或 dts 導(dǎo)入/導(dǎo)出向?qū)В锌赡転橐恍┲蛔鳛閿?shù)據(jù)源的提供程序指定只讀或正在使用狀態(tài)(例如,
microsoft access 和 odbc dsn )。單擊"連接屬性"對(duì)話框中的"高級(jí)"選項(xiàng)卡,然后在"高級(jí)連接屬性"對(duì)話框中,將模式
屬性值設(shè)置為 1。
使用 dts 導(dǎo)入/導(dǎo)出向?qū)Щ?dts 設(shè)計(jì)器創(chuàng)建表時(shí),在目的地上創(chuàng)建的表的所有者為當(dāng)前用戶(通常是 dbo),與誰是源表
的所有者無關(guān)。這將產(chǎn)生這種情況:dbo 試圖在目的地創(chuàng)建一個(gè)表,而該表的名稱已經(jīng)存在,從而導(dǎo)致嘗試失敗。
當(dāng)使用 dts 設(shè)計(jì)器定義數(shù)據(jù)驅(qū)動(dòng)的查詢時(shí),數(shù)據(jù)目的地必須能夠支持 ole db icommand 接口。由于這種限制,類似文本
文件的目的不被支持。
如果 text、ntext 和 image 類型的字段長度超過 8388602 字節(jié),則 dts 的復(fù)制 sql server 對(duì)象任務(wù)將截?cái)喑龅牟?br>分。dts 設(shè)計(jì)器或 dts 導(dǎo)入/導(dǎo)出向?qū)Р伙@示任何錯(cuò)誤信息,而是顯示任務(wù)已成功完成。
唯一的失敗指示是一條寫入日志文件的日志消息,此文件的名稱為 <server>.<database>.log,位于"復(fù)制 sql server 對(duì)
象任務(wù)屬性"對(duì)話框的"復(fù)制"選項(xiàng)卡所指定的腳本文件目錄中。此日志消息詳細(xì)說明表和列,但不指出發(fā)生截?cái)嗟男小o任
何錯(cuò)誤記錄寫入 dts 錯(cuò)誤文件或 sql server 日志。
microsoft sna server
當(dāng)使用 microsoft sna server 作為數(shù)據(jù)源時(shí),請(qǐng)考慮下列事項(xiàng):
as/400 和 vsam 的 microsoft ole db 提供程序不支持 dts 導(dǎo)入/導(dǎo)出向?qū)в脕韯?chuàng)建或截?cái)啾淼?sql 語句。
microsoft access
使用 access 時(shí),應(yīng)考慮下列事項(xià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(shí)提交它們。結(jié)果是,可以在導(dǎo)出大量表時(shí),面
對(duì)內(nèi)存較小的形勢(shì)。然而,可以通過構(gòu)造在多個(gè)傳遞中發(fā)送較少行數(shù)的 select 語句解決該問題。
microsoft visual foxpro
microsoft visual foxpro® 只支持 numeric 數(shù)據(jù)類型的 (15,9) 精度。如果導(dǎo)出到 visual foxpro 的數(shù)據(jù)超出該精
度,則會(huì)被截?cái)嗖⑺纳嵛迦搿?
visual foxpro 不支持 select into 語句。
dts 查詢?cè)O(shè)計(jì)器支持 visual foxpro insert value 語句,但不支持使用 select 語句的 insert 語句。
odbc 的 microsoft ole db 驅(qū)動(dòng)程序無法使用 foxpro odbc 驅(qū)動(dòng)程序?qū)?blob 寫入 visual foxpro,因?yàn)?visual
foxpro 不支持動(dòng)態(tài)游標(biāo)。
odbc
當(dāng)連接到 odbc 數(shù)據(jù)源時(shí),請(qǐng)考慮下列事項(xiàng):
odbc 的 microsoft ole db 提供程序在執(zhí)行導(dǎo)出操作時(shí)需要一個(gè)在帶有 blob 數(shù)據(jù)列的所有目標(biāo)表上的唯一鍵。
當(dāng)使用帶有 sql server odbc 驅(qū)動(dòng)程序的 odbc 的 microsoft ole db 提供程序時(shí),在安排帶有源行集中其它數(shù)據(jù)類型的
列之后安排所有 blob 列。可以使用 select 語句重新將 blob 列安排到源行集的末尾。dts 導(dǎo)入/導(dǎo)出向?qū)ё詣?dòng)地執(zhí)行該
操作。
重要 當(dāng)使用帶有 sql server odbc 驅(qū)動(dòng)程序的 odbc 的 microsoft ole db 提供程序時(shí),請(qǐng)嘗試預(yù)覽帶有連接忙錯(cuò)誤的
存儲(chǔ)過程失敗。如果使用 sql server 的 microsoft ole db 提供程序,該問題就不會(huì)發(fā)生。
如果一個(gè)用于 sql server 的 microsoft odbc 驅(qū)動(dòng)程序連接由多個(gè)線程共享,此連接可能會(huì)失敗,并返回錯(cuò)誤信
息"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ù)
庫,則運(yùn)行 instcatl.sql 以啟用通過用于 sql server 的 microsoft ole db 提供程序進(jìn)行訪問。
oracle
當(dāng)使用 oracle 作為數(shù)據(jù)源時(shí),請(qǐng)考慮以下事項(xiàng):
用于 oracle 的 microsoft odbc 和 oledb 驅(qū)動(dòng)程序支持 oracle 7.3 blob 數(shù)據(jù)類型,不支持 oracle 8.0 數(shù)據(jù)類型。
例如,不支持 blob、clob、nclob 和 bfile。
用于 oracle 的 microsoft obdc 驅(qū)動(dòng)程序不支持將 unicode 字符串發(fā)送到 oracle 服務(wù)器中。oracle 要求在 unicode
字符串前加上前綴字母 n。
用于 oracle 的 microsoft obdc 驅(qū)動(dòng)程序不支持 oracle number 數(shù)據(jù)類型的負(fù)向縮放。
用于 oracle 的 microsoft obdc 驅(qū)動(dòng)程序報(bào)告無指定精度的 oracle number 數(shù)據(jù)類型的長度為 20 位數(shù)字。當(dāng)從
oracle (不考慮目的)中導(dǎo)入時(shí),如果有多于 20 位的數(shù)字,并且如果目的表還不存在,可能必須手工地增加精度。
在表中 oracle 僅支持一個(gè) 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)更多信息,
請(qǐng)參見分布式事務(wù)。
由于用于 oracle 的 microsoft ole db 提供程序不支持 icommandwithparameters,所以它不能用作數(shù)據(jù)驅(qū)動(dòng)的查詢?nèi)蝿?wù)
的目的地。在 dts 設(shè)計(jì)器中使用此提供程序時(shí),轉(zhuǎn)換數(shù)據(jù)任務(wù)、數(shù)據(jù)驅(qū)動(dòng)的查詢?nèi)蝿?wù)以及執(zhí)行 sql 任務(wù)上的"參數(shù)"按鈕
將被禁用。
ibm as/400 上的 db2
當(dāng)連接到 db2 數(shù)據(jù)源時(shí),請(qǐng)考慮以下事項(xiàng):
在 as/400 系統(tǒng)上不支持 unicode 或 blob。
在 as/400 服務(wù)器上不能轉(zhuǎn)換任何有 null 列值的表,因?yàn)?as/400 在其 create table 語句中不支持 null 語法。然
而,如果編輯 create table 語法以清除對(duì) null 的引用時(shí),則可以發(fā)送 null 值。as/400 不支持 not null;如果沒指
定就假定為 null。
使用 sybase odbc 驅(qū)動(dòng)程序
當(dāng)連接到一個(gè) sybase odbc 數(shù)據(jù)源時(shí),請(qǐng)考慮以下事項(xiàng):
當(dāng)使用 dts 導(dǎo)入/導(dǎo)出向?qū)?shù)據(jù)從 sql server 轉(zhuǎn)換到 sybase 11 版本時(shí):
默認(rèn)情況下,sql server numeric (3,0) 數(shù)據(jù)類型映射為 sybase smallmoney。為避免數(shù)據(jù)丟失,請(qǐng)更改此設(shè)置。
默認(rèn)情況下,sql server numeric (18,x 或 19,x) 數(shù)據(jù)類型映射為 sybase money 數(shù)據(jù)類型。為避免數(shù)據(jù)丟失,請(qǐng)更改
此設(shè)置。
將數(shù)據(jù)移動(dòng)到一個(gè)新的 sybase 表時(shí),如果單擊了"列映射和轉(zhuǎn)換"對(duì)話框中的"確定"按鈕,向?qū)?huì)返回錯(cuò)誤信息"表已存
在"。應(yīng)該忽略此消息。
不能使用 dts 導(dǎo)入/導(dǎo)出向?qū)Сゲ⑶抑匦聞?chuàng)建 sybase 表。必須不使用向?qū)韴?zhí)行此操作。
dts 查詢?cè)O(shè)計(jì)器不支持 sybase sqlanywhere create table 語句。
由于 sqlanywhere 驅(qū)動(dòng)程序中的限制,dts 導(dǎo)入/導(dǎo)出向?qū)看沃荒軐⒁粋€(gè)表移動(dòng)到 sqlanywhere 數(shù)據(jù)庫。可以使用
dts 設(shè)計(jì)器來克服此限制。然而,因?yàn)?sqlanywhere 驅(qū)動(dòng)程序不是安全線程,所以,必須將每個(gè)表的 step 對(duì)象的
executeinmainthread 屬性設(shè)置為 true。
如果表中包含 blob 列,則不能將此表復(fù)制到 sybase 目的中。
如果通過編程方式從 sybase 中復(fù)制一個(gè)包含 image 數(shù)據(jù)類型的表,則更改默認(rèn)的 blob 設(shè)置會(huì)導(dǎo)致失敗。
dbase 和 paradox
當(dāng)連接到 dbase 和 paradox 數(shù)據(jù)源時(shí),請(qǐng)考慮以下事項(xiàng):
dbase 和 paradox 中的表名稱被限制為八個(gè)字符。dbase 中的列名稱被限制為 10 個(gè)字符。
文件導(dǎo)入或?qū)С?br>當(dāng)從文本文件導(dǎo)入或?qū)С鰯?shù)據(jù)時(shí),請(qǐng)考慮以下事項(xiàng):
在 char 或 varchar 列中導(dǎo)入或?qū)С鰯?shù)據(jù)時(shí),如果客戶端 oem 代碼頁與服務(wù)器上的代碼頁不同,則某些擴(kuò)展字符可能不
被復(fù)制。在 nchar 或 nvarchar 列中導(dǎo)入或?qū)С鰯?shù)據(jù)時(shí),所有字符均能正確復(fù)制。
如果將 blob(包括 sql server 的 text 和 ntext 數(shù)據(jù)類型)列導(dǎo)出到固定長度的文本字段中,則將默認(rèn)長度設(shè)置為
blbo 字段的最大長度(大約 2gb)。通過選擇較小的但足夠的字段長度來防止磁盤溢出,或者在可能的時(shí)候使用分隔格
式。
dts 中使用的用于文本文件的 ole db 提供程序不能處理超過兩兆字節(jié) (mb) 的 blob 數(shù)據(jù)列。
代碼頁、排序規(guī)則和非 unicode 數(shù)據(jù)問題
使用 dts 在具有不同代碼頁和排序規(guī)則的 sql server 數(shù)據(jù)庫間復(fù)制數(shù)據(jù)時(shí),數(shù)據(jù)可能會(huì)丟失或轉(zhuǎn)換不正確。
為避免出現(xiàn)轉(zhuǎn)換問題,應(yīng)以 unicode 形式存儲(chǔ)國際數(shù)據(jù)。一旦轉(zhuǎn)換為 unicode 后,便可很容易地將任何排序規(guī)則或代碼
頁中的數(shù)據(jù)傳送到任何 microsoft sql server 2000 或 microsoft sql server 7.0 數(shù)據(jù)庫,而不會(huì)出現(xiàn)數(shù)據(jù)丟失或轉(zhuǎn)換
不正確這類問題。
在 microsoft sql server 2000 中,排序規(guī)則與具體的代碼頁相關(guān)聯(lián)并被指派給各個(gè)列。(microsoft sql server 7.0
使用單個(gè)的默認(rèn)代碼頁且不支持列級(jí)排序規(guī)則)。如果用于源列和目的列的代碼頁匹配,則非 unicode 列不會(huì)發(fā)生數(shù)據(jù)丟
失。在非 unicode 列間復(fù)制數(shù)據(jù)時(shí),如果源列與目的列不匹配,則將發(fā)生數(shù)據(jù)丟失。在某些情況下,dts 執(zhí)行最佳的匹配
映射。如果源代碼頁包含的字符在目的代碼頁中未出現(xiàn),則將發(fā)生數(shù)據(jù)丟失。此外,dts 執(zhí)行復(fù)制時(shí)不需要任何轉(zhuǎn)換干
預(yù),這將導(dǎo)致在兩個(gè)代碼頁中不是由同一個(gè)二進(jìn)制值表示的數(shù)據(jù)丟失。下面的問題及準(zhǔn)則分別針對(duì)使用復(fù)制 sql server
對(duì)象任務(wù)的情況,和使用復(fù)制列轉(zhuǎn)換在不同排序規(guī)則或代碼頁之間復(fù)制數(shù)據(jù)的情況。
復(fù)制 sql server 對(duì)象任務(wù)
下面論述復(fù)制 sql server 對(duì)象任務(wù)如何處理非 unicode 數(shù)據(jù):
在 sql server 2000 實(shí)例間復(fù)制數(shù)據(jù)時(shí),只要設(shè)置復(fù)制 sql server 對(duì)象任務(wù)的 usecollation 屬性,便不會(huì)發(fā)生數(shù)據(jù)丟
失。
將數(shù)據(jù)從 sql server 2000 實(shí)例復(fù)制到 sql server 7.0 時(shí),對(duì)于具有與數(shù)據(jù)庫默認(rèn)排序規(guī)則代碼頁相匹配的排序規(guī)則的
列,使用最佳匹配映射。而具有不同代碼頁的列中所存儲(chǔ)的數(shù)據(jù),則被解釋為正在用默認(rèn)代碼頁進(jìn)行編碼處理,轉(zhuǎn)換過程
中將伴隨數(shù)據(jù)丟失。
將數(shù)據(jù)從 sql server 7.0 復(fù)制到sql server 2000 實(shí)例時(shí),由于 sql server 7.0 無法確定其默認(rèn)代碼頁所映射的排序
規(guī)則,usecollation 屬性不可用。執(zhí)行復(fù)制 sql server 對(duì)象任務(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í),如果源數(shù)據(jù)庫和目的數(shù)據(jù)庫使用不同的默認(rèn)代碼頁,dts 將執(zhí)行
最佳匹配映射。
若要確保復(fù)制非 unicode 時(shí)不發(fā)生數(shù)據(jù)丟失,可使用 sql server 大容量復(fù)制功能以 unicode 格式導(dǎo)出數(shù)據(jù),然后使用
大容量復(fù)制或 dts 導(dǎo)入數(shù)據(jù)。
若要禁用默認(rèn)排序規(guī)則腳本,請(qǐng)?zhí)砑哟a或使用脫接編輯或動(dòng)態(tài)屬性任務(wù)將 sqldmoscript2_70only 的值添加到復(fù)制 sql
server 對(duì)象任務(wù)的 scriptoptionex 屬性中。
復(fù)制列轉(zhuǎn)換
下面論述復(fù)制列轉(zhuǎn)換如何在不同代碼頁之間處理非 unicode 數(shù)據(jù):
如果源列為 unicode 而目的列為非 unicode,則執(zhí)行最佳匹配映射,并嘗試在源列和目的列之間轉(zhuǎn)換數(shù)據(jù)。
如果源列為非 unicode 而目的列為 unicode,則不論實(shí)際使用的代碼頁是什么,dts 都將源列視為屬于代碼頁 1252。
如果源列和目的列都為非 unicode,原始數(shù)據(jù)不經(jīng)轉(zhuǎn)換即被復(fù)制,將發(fā)生部分?jǐn)?shù)據(jù)丟失。