WRITETEXT (Transact-SQL)

允许对现有的 text、ntext 或 image 列执行最小日志记录的交互式更新。WRITETEXT 将覆盖受其影响的列中的所有现有数据。WRITETEXT 语句不能用于视图中的 text、ntext 和 image 列。

重要说明重要提示

后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。请改用大值数据类型和 UPDATE 语句的 .WRITE 子句。

主题链接图标Transact-SQL 语法约定

语法

WRITETEXT [BULK]
    { table.column text_ptr }
    [ WITH LOG ] { data }

参数

  • BULK
    启用上载工具来上载二进制数据流。该数据流必须由该工具在 TDS 协议级别提供。在数据流不存在时,查询处理器将忽略 BULK 选项。

    重要说明重要提示

    我们建议不要在基于 SQL Server 的应用程序中使用 BULK 选项。在 SQL Server 的未来版本中可能会更改或删除该选项。

  • table**.**column
    要更新的表的名称以及 text、ntext 或 image 列的名称。表和列的名称必须符合标识符规则。指定数据库名和所有者名是可选的。

  • text_ptr
    存储指向 text、ntext 或 image 数据的指针的值。text_ptr 必须是 binary(16)。若要创建文本指针,请对非空值的 text、ntext 或 image 列数据执行 INSERTUPDATE 语句。

  • WITH LOG
    SQL Server 忽略此参数。日志记录由数据库的当前恢复模式决定。

  • data
    要存储的实际 text、ntext 或 image 数据。data 可以是文字或参数。对于 text、ntext 和 image 数据,可以使用 WRITETEXT 以交互方式插入的最大文本长度约为 120 KB。

注释

请使用 WRITETEXT 替换 text、ntext 和 image 数据,并使用 UPDATETEXT 修改 text、ntext 和 image 数据。UPDATETEXT 更加灵活,因为它只更改 text、ntext 或 image 列的一部分而非整个列。

为获得最佳性能,推荐以 8040 字节整数倍的块区大小,插入或更新 text、ntext 和 image 数据。

如果数据库为简单模式或大容量日志恢复模式,则在插入或追加新数据时,使用 WRITETEXT 语句的 text、ntext 和 image 操作将成为最小日志记录操作。有关详细信息,请参阅可以尽量减少日志量的操作

注意注意

在更新现有值时,不使用最小日志记录。

为了正确使用 WRITETEXT,列必须已经包含有效的文本指针。

如果该表没有行内文本,则在通过 INSERT 向 text 列中添加显式或隐式空值时,SQL Server 不初始化 text 列以节省空间,并且不能获取这类空值的文本指针。若要将 text 列初始化为 NULL,请使用 UPDATE 语句。如果表有行内文本,则不必为空值初始化文本列,而且始终可以获取文本指针。

ODBC SQLPutData 函数更快,且使用的动态内存比 WRITETEXT 少。该函数可插入最多 2 GB 的 text、ntext 或 image 数据。

在 SQL Server 中,可能存在指向 text、ntext 或 image 数据的行内文本指针,但可能无效。有关 text in row 选项的信息,请参阅 sp_tableoption (Transact-SQL)。有关使文本指针失效的信息,请参阅 sp_invalidate_textptr (Transact-SQL)

权限

需要对指定表的 UPDATE 权限。可在转移 UPDATE 权限时转移这些权限。

示例

以下示例将文本指针放到局部变量 @ptrval 中,然后 WRITETEXT 将新的文本字符串放到 @ptrval 指向的行中。

注意注意

若要运行此示例,必须安装 pubs 示例数据库。有关如何安装 pubs 示例数据库的信息,请参阅下载 Northwind 和 pubs 示例数据库

USE pubs;
GO
ALTER DATABASE pubs SET RECOVERY SIMPLE;
GO
DECLARE @ptrval binary(16);
SELECT @ptrval = TEXTPTR(pr_info) 
FROM pub_info pr, publishers p
WHERE p.pub_id = pr.pub_id 
   AND p.pub_name = 'New Moon Books'
WRITETEXT pub_info.pr_info @ptrval 'New Moon Books (NMB) has just released another top ten publication. With the latest publication this makes NMB the hottest new publisher of the year!';
GO
ALTER DATABASE pubs SET RECOVERY SIMPLE;
GO