SQL Server檢索ntext、text和image數(shù)據(jù)類型的注意事項
SQL Server檢索數(shù)據(jù)時,根據(jù)不同的數(shù)據(jù)類型,SQL Server檢索要注意的問題也不一樣,下面就讓我們一起來了解一下SQL Server檢索ntext、text和image數(shù)據(jù)類型的注意事項。
Microsoft® SQL Server™ 的 ntext、text 和 image 數(shù)據(jù)類型在單個值中可以包含非常大的數(shù)據(jù)量(***可達(dá) 2 GB)。單個數(shù)據(jù)值通常比應(yīng)用程序在一個步驟中能夠檢索的大;某些值可能還會大于客戶端的可用虛擬內(nèi)存。因此,在檢索這些值時,通常需要一些特殊的步驟。
如果 ntext、text 和 image 數(shù)據(jù)值不超過 Unicode 串、字符串或二進(jìn)制串的長度(分別為 4,000 個字符、8,000 個字符和 8,000 個字節(jié)),就可以在 SELECT、UPDATE 和 INSERT 語句中引用它們,其引用方式與較小的數(shù)據(jù)類型相同。例如,包含短值的 ntext 列可以在 SELECT 語句的選擇列表中引用,這與 nvarchar 列的引用方式相同。引用時必須遵守一些限制,例如不能在 WHERE 子句中直接引用 ntext、text 或 image 列。這些列可以作為返回其它數(shù)據(jù)類型(例如 ISNULL、SUBSTRING 或 PATINDEX)的某個函數(shù)的參數(shù)包含在 WHERE 子句中,也可以包含在 IS NULL、IS NOT NULL 或 LIKE 表達(dá)式中。
處理較大的數(shù)據(jù)值
但是,如果 ntext、text 和 image 數(shù)據(jù)值較大,則必須逐塊處理。Transact-SQL 和數(shù)據(jù)庫 API 均包含使應(yīng)用程序可以逐塊處理 ntext、text 和 image 數(shù)據(jù)的函數(shù)。
數(shù)據(jù)庫 API 按照一種通用的模式處理長 ntext、text 和 image 列:
若要讀取一個長列,應(yīng)用程序只需在選擇列表中包含 ntext、text 或 image 列,并將該列綁定到一個程序變量,該變量應(yīng)足以容納適當(dāng)?shù)臄?shù)據(jù)塊。然后,應(yīng)用程序就可以執(zhí)行該語句,并使用 API 函數(shù)或方法將數(shù)據(jù)逐塊檢索到綁定的變量中。
若要寫入一個長列,應(yīng)用程序可使用參數(shù)標(biāo)記 (?) 在相應(yīng)位置代替 ntext、text 或 image 列中的值,以執(zhí)行 INSERT 或 UPDATE 語句。參數(shù)標(biāo)記(對 ADO 而言則為參數(shù))被綁定到一個足以容納數(shù)據(jù)塊的程序變量上。應(yīng)用程序進(jìn)入循環(huán),在循環(huán)中先將下一組數(shù)據(jù)移到綁定的變量中,然后調(diào)用 API 函數(shù)或方法寫入數(shù)據(jù)塊。這一過程將反復(fù)進(jìn)行,直到整個數(shù)據(jù)值發(fā)送完畢。
使用 text in row
在 Microsoft SQL Server 2000 中,用戶可以在表上啟用 text in row 選項,以使該表能夠在其數(shù)據(jù)行中存儲 text、ntext 或 image 數(shù)據(jù)。
若要啟用該選項,請執(zhí)行 sp_tableoption 存儲過程,將 text in row 指定為選項名并將 on 指定為選項值。BLOB(二進(jìn)制大對象:text、ntext 或 image 數(shù)據(jù))行中可以存儲的默認(rèn)***大小為 256 字節(jié),但是值的范圍可以從 24 到 7000。若要指定默認(rèn)值以外的***大小,請指定該范圍內(nèi)的整數(shù)作為選項值。
如果應(yīng)用下列條件,則將 text、ntext 或 image 字符串存儲在數(shù)據(jù)行中:
啟用 text in row。
字符串的長度比 @OptionValue 所指定的限制短
數(shù)據(jù)行中有足夠的可用空間。
當(dāng) BLOB 字符串存儲在數(shù)據(jù)行中時,讀取和寫入 text、ntext 或 image 字符串可以與讀取或?qū)懭胱址投M(jìn)制字符串一樣快。SQL Server 不必訪問單獨的頁以讀取或?qū)懭?BLOB 字符串。
如果 text、ntext 或 image 字符串比行中所指定的限制或可用空間大,則將指針存儲在該行中。在行中存儲 BLOB 字符串的條件仍然適用,但是:數(shù)據(jù)行中必須有足夠的空間容納指針。
【編輯推薦】