Transact-SQL 参考

sp_tableoption

为用户定义表设置选项值。sp_tableoption 可以用来在具有 text、ntext 或 image 列的表上启用 text in row 功能。

语法

sp_tableoption [ @TableNamePattern = ] 'table'
    , [ @OptionName = ] 'option_name'
    , [ @OptionValue = ] 'value'

参数

[@TableNamePattern =] 'table'

是限定的或非限定的用户定义数据库表的名称。如果提供了一个完全限定的表名,包括数据库名,那么该数据库名必须是当前数据库的名称。多个表的表选项的设置不能一次完成。table_pattern 的数据类型为 nvarchar(776),没有默认设置。

[@OptionName =] 'option_name'

是表选项名。option_name 的数据类型为 varchar(35),默认设置不是 NULL。option_name 可以有下列值。

值 描述
pintable 当禁用时(默认值),它将表标记为不再驻留内存。启用时,将表标记为驻留内存。
table lock on bulk load 禁用时(默认值),用户定义表的大容量处理获得行锁。启用时,用户定义表的大容量处理获得大容量更新锁。
insert row lock Microsoft® SQL Server™ 2000 中不支持该值。

对于 SQL Server 6.5 版而言,在指定表上启用或禁用插入行锁定 (IRL) 操作。在 SQL Server 7.0 中,行级锁定默认为启用。SQL Server 的锁定策略为行锁定,并可能提升为页或表锁定。这个选项并不改变 SQL Server 的加锁行为(它没有影响),包含它只是为了与现有脚本和过程兼容。

text in row 当为 OFF 或 0(禁用,默认值)时,它不更改当前行为,且在行中不存在 BLOB。

指定该值且 @OptionValue 为 ON(已启用)或从 24 到 7000 的整数值时,直接在数据行中存储新的 text、ntext 或 image 字符串。更新 BLOB 值时,所有现有的 BLOB(text、ntext 或 image 数据)都将更改成 text in row 格式。有关更多信息,请参见注释部分。


[ , [ @OptionValue = ] 'value' ]

表示是启用 option_name(true、on 或 1)还是禁用 option_name(false、off 或 0)。value 的数据类型为 varchar(12),没有默认设置。value 不区分大小写。

对于 text in row 选项,有效选项值是 0、on、off,或从 24 到 7000 的整数。当 value 为 on 时,默认的限制为 256 字节。

返回代码值

0(成功)或错误号(失败)

注释

sp_tableoption 仅可用于设置用户定义表的选项值。若要显示表属性,请使用 OBJECTPROPERTY。

sp_tableoption 的 text in row 选项只能在含有文本列的表中启用或禁用。若表不含文本列,SQL Server 将产生错误。

当启用 text in row 选项时,@OptionValue 参数使用户得以指定存储在行中的 BLOB(二进制大对象:text、ntext 或 image 数据)的最大值。默认设置是 256 字节,但是行中的值可以在 24 到 7000 字节范围内变化。

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

  1. 启用 text in row。

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

  3. 数据行中有足够的可用空间。

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

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

将存储在表行中的 BLOB 字符串和指针视为类似于可变长度的字符串。SQL Server 仅使用存储字符串或指针所需的字节数。

首先启用 text in row 时,不立即转换现有的 BLOB 字符串。仅当更新字符串时才转换它们。同样,text in row 选项限制增加时,将不转换已在数据行中的 text、ntext 或 image 字符串以遵从新限制,直到更新它们。

说明  禁用 text in row 选项或减小该选项的限制将需要转换所有的 BLOB,因此进程可能较长,这取决于必须转换的 BLOB 字符串数。在执行转换进程的过程中锁定表。

一个 table 变量,包括返回 table 变量的函数,自动启用 text in row 选项,并具备 256 字节的 inline limit 默认值。这一选项不可更改。

text in row 支持 TEXTPTR、WRITETEXT、UPDATETEXT 和 READTEXT 函数。用户可以使用 SUBSTRING() 函数读取 BLOB 的部分,但是必须记住,行内文本指针与其它文本指针相比有不同的有效期和个数限制。有关更多信息,请参见管理 ntext、text 和 image 数据。

权限

只有 sysadmin 固定服务器角色的成员可以修改表选项 pintable。

sysadmin 固定服务器角色成员,db_owner 和 db_ddladmin 固定数据库角色成员以及表所有者,都可以修改任何用户定义表的 table lock on bulk load 和 text in row 选项。其他用户只能修改自己拥有的表的选项。

示例
A. 启用 Northwind 数据库中表 'orders' 的 'text in row' 选项。
EXEC sp_tableoption 'orders', 'text in row', 'ON'
B. 启用 Northwind 数据库中表 'orders' 的 'text in row' 选项,并将 inline limit 设置为 1000。
EXEC sp_tableoption 'orders', 'text in row', '1000'
C. 启用 Northwind 数据库中表 'orders' 的 'text in row' 选项,并将 inline limit 设置为 23,这已超出允许范围。
sp_tableoption 'orders', 'text in row', '23'

会产生错误信息,提示参数超出范围。

D. 禁用 Northwind 数据库中表 'orders' 的 'text in row' 选项。
EXEC sp_tableoption 'orders', 'text in row', 'off'

-或-

EXEC sp_tableoption 'orders', 'text in row', '0'

请参见

DBCC PINTABLE

DBCC UNPINTABLE

OBJECTPROPERTY

系统存储过程