若要读取一个长列,应用程序只需在选择列表中包含 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 in row 选项,text、ntext 或 image 字符串将存储在数据行外;只有这些字符串的文本指针驻留在数据行中。文本指针指向由内部指针生成的树的根节点,而这些内部指针映射到实际存储(text、ntext 或 image 数据的)字符串段的页。
SQL Server 2000 中的行文本指针与 SQL Server 早期版本中的文本指针不同。行文本指针的行为就象 BLOB 数据的文件句柄;早期的文本指针功能则象 BLOB 数据的地址。因此,在使用行文本指针时,请记住下列特性:
重要 虽然游标中允许有行文本,但却不允许有行文本指针。如果尝试声明包含行文本指针的游标,SQL Server 将返回错误信息(8654、16、1、"A cursor plan could not be generated for the given statement because it contains textptr(inrow lob)."、1033)。
数字
对于每个数据库,每个事务最多允许 1024 个活动行文本指针。
锁定
当用户获取活动文本指针时,SQL Server 2000 在第一个用户控制文本指针时锁定数据行,并确保没有其他用户修改或删除该行。锁在文本指针变为无效时被释放。若要使文本指针无效,请使用 sp_invalidate_textptr。
INSERT t1 VALUES ('1','This is text.')
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO
BEGIN TRAN
DECLARE @ptr varbinary(16)
SELECT @ptr = textptr(c2)
FROM t1
WHERE c1 = 1
READTEXT t1.c2 @ptr 0 5
COMMIT TRAN
GO
下面的事务将会失败:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO
BEGIN TRAN
DECLARE @ptr varbinary(16)
SELECT @ptr = textptr(c2)
FROM t1
WHERE c1 = 1
WRITETEXT t1.c2 @ptr 'xx'
COMMIT TRAN
GO
持续时间
行文本指针仅在事务内有效。提交事务时,文本指针变为无效。
在某个事务内,当发生下列任一操作时,行文本指针可能无效:
会话结束。
删除该事务中的数据行。(其它事务无法删除数据行,因为该行包含锁。)
文本指针所在的表的架构已更改。使文本指针无效的架构更改操作包括:创建或除去聚集索引,改变或除去表,截断表,通过 sp_tableoption 更改 text in row 选项,以及执行 sp_indexoption。
使用前面的示例,下列脚本在 SQL Server 早期版本中有效,但在 SQL Server 2000 中将生成错误。
通过数据库 API 使用 ntext、text 和 image 数据
这一部分概述数据库 API 处理 ntext、text 和 image 数据的方式:
ADO
ADO 可以将 ntext、text 或 image 列或参数映射为 Field 或 Parameter 对象。使用 GetChunk 方法逐块检索数据,使用 AppendChunk 方法逐块写数据。有关更多信息,请参见管理 Long 数据类型。
OLE DB
OLE DB 使用 ISequentialStream 接口支持 ntext、text 和 image 数据类型。ISequentialStream::Read 方法逐块读取长数据,ISequentialStream::Write 方法将长数据逐块写入数据库。有关更多信息,请参见 BLOB 和 OLE 对象。