SQL Server检索ntext、text和image数据类型的注意事项


  本文标签:SQL Server检索

  SQL Server检索数据时,根据不同的数据类型,SQL Server检索要注意的问题也不一样,下面就让我们一起来了解一下SQL Server检索ntext、text和image数据类型的注意事项  。

  Microsoft® SQL Server™ 的 ntext、text 和 image 数据类型在单个值中可以包含非常大的数据量(最大可达 2 GB)  。单个数据值通常比应用程序在一个步骤中能够检索的大;某些值可能还会大于客户端的可用虚拟内存  。因此,在检索这些值时,通常需要一些特殊的步骤  。

  如果 ntext、text 和 image 数据值不超过 Unicode 串、字符串或二进制串的长度(分别为 4,000 个字符、8,000 个字符和 8,000 个字节),就可以在 SELECT、UPDATE 和 INSERT 语句中引用它们,其引用方式与较小的数据类型相同  。例如,包含短值的 ntext 列可以在 SELECT 语句的选择列表中引用,这与 nvarchar 列的引用方式相同  。引用时必须遵守一些限制,例如不能在 WHERE 子句中直接引用 ntext、text 或 image 列  。这些列可以作为返回其它数据类型(例如 ISNULL、SUBSTRING 或 PATINDEX)的某个函数的参数包含在 WHERE 子句中,也可以包含在 IS NULL、IS NOT NULL 或 LIKE 表达式中  。

  处理较大的数据值
但是,如果 ntext、text 和 image 数据值较大,则必须逐块处理  。Transact-SQL 和数据库 API 均包含使应用程序可以逐块处理 ntext、text 和 image 数据的函数  。

  数据库 API 按照一种通用的模式处理长 ntext、text 和 image 列:

  若要读取一个长列,应用程序只需在选择列表中包含 ntext、text 或 image 列,并将该列绑定到一个程序变量,该变量应足以容纳适当的数据块  。然后,应用程序就可以执行该语句,并使用 API 函数或方法将数据逐块检索到绑定的变量中  。

  若要写入一个长列,应用程序可使用参数标记 (?) 在相应位置代替 ntext、text 或 image 列中的值,以执行 INSERT 或 UPDATE 语句  。参数标记(对 ADO 而言则为参数)被绑定到一个足以容纳数据块的程序变量上  。应用程序进入循环,在循环中先将下一组数据移到绑定的变量中,然后调用 API 函数或方法写入数据块  。这一过程将反复进行,直到整个数据值发送完毕  。
使用 text in row
在 Microsoft SQL Server 2000 中,用户可以在表上启用 text in row 选项,以使该表能够在其数据行中存储 text、ntext 或 image 数据  。

  若要启用该选项,请执行 sp_tableoption 存储过程,将 text in row 指定为选项名并将 on 指定为选项值  。BLOB(二进制大对象:text、ntext 或 image 数据)行中可以存储的默认最大大小为 256 字节,但是值的范围可以从 24 到 7000  。若要指定默认值以外的最大大小,请指定该范围内的整数作为选项值  。

  如果应用下列条件,则将 text、ntext 或 image 字符串存储在数据行中:

  启用 text in row  。

  字符串的长度比 @OptionValue 所指定的限制短

  数据行中有足够的可用空间  。
当 BLOB 字符串存储在数据行中时,读取和写入 text、ntext 或 image 字符串可以与读取或写入字符串和二进制字符串一样快  。SQL Server 不必访问单独的页以读取或写入 BLOB 字符串  。

  如果 text、ntext 或 image 字符串比行中所指定的限制或可用空间大,则将指针存储在该行中  。在行中存储 BLOB 字符串的条件仍然适用,但是:数据行中必须有足够的空间容纳指针  。