sp_tableoption 及使用 使用大值数据类型

sp_tableoption (Transact-SQL) 

设置用户定义表的选项值。sp_tableoption 可用于控制包含 varchar(max)nvarchar(max)varbinary(max)xmltextntext image 列的表的行内行为。

重要事项:

SQL Server 的将来版本中,将删除 text in row 功能。若要存储大值数据,建议您使用 varchar(max)nvarchar(max) varbinary(max) 数据类型。

Transact-SQL 语法约定

<script type="text/Javascript"> var ExpCollDivStr = ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl032556386,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl03img,"; </script> 语法

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

<script type="text/Javascript"> var ExpCollDivStr = ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl05a4359b5,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl05img,"; </script> 参数

[ @TableNamePattern = ] 'table'

用户定义数据库表的限定名称或非限定名称。如果提供了包含数据库名称的完全限定表名,则数据库名称必须为当前数据库的名称。不能同时设置多个表的表选项。table_pattern 的数据类型为 nvarchar(776),无默认值。

[ @OptionName = ] 'option_name'

表选项名称。option_name 的数据类型为 varchar(35),无默认值 NULLoption_name 可以是下列值之一。

说明

table lock on bulk load

禁用时(默认值),使用户定义表的大容量处理获得行锁。启用时,使用户定义表的大容量处理获得大容量更新锁。

insert row lock

SQL Server 2005 不支持。

SQL Server 的锁定策略为行锁定,并可能提升为页锁定或表锁定。此选项对 SQL Server 的锁定行为没有影响,保留此选项只是为了与现有脚本和过程兼容。

text in row

如果为 OFF 0(禁用,默认值),则不更改当前行为,且在行中不存在 BLOB

如果指定此值,并且 @OptionValue 设置为 ON(启用)或者是 24 7000 之间的一个整数值,则在数据行中直接存储新的 textntext image 字符串。如果更新了 BLOB 值,则现有的所有 BLOB(二进制大型对象:textntext image 数据)都将更改为 text in row 格式。有关详细信息,请参阅备注

large value types out of row

1 = 表中的 varchar(max)nvarchar(max)varbinary(max) xml 列都存储在行外,用一个 16 个字节的指针指向根目录。

0 = varchar(max)nvarchar(max)varbinary(max) xml 值直接存储在数据行中(最大限制为 8000 字节,并且只要记录中可以容纳该值)。如果记录中容纳不下该值,则指针存储在行内,其余内容存储在 LOB 存储空间内的行外。

[ @OptionValue = ] 'value'

指示 option_name 被启用(trueon 1)还是禁用(falseoff 0)。value 的数据类型为 varchar(12),无默认值。value 不区分大小写。

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

<script type="text/Javascript"> var ExpCollDivStr = ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl06355f8f0,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl06img,"; </script> 备注

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

sp_tableoption 中的 text in row 选项只能在包含文本列的表中启用或禁用。如果表不含文本列,SQL Server 将引发错误。

如果启用了 text in row 选项,@OptionValue 参数将允许用户为 BLOB 指定可在行中存储的最大大小。默认值为 256 字节,但是值可以介于 24 7000 个字节之间。

在满足以下条件时,数据行可以存储 textntext image 字符串:

·             启用了 text in row

·             字符串的长度比 @OptionValue 中指定的限制值短。

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

数据行中存储 BLOB 字符串时,读取和写入 textntext image 字符串可以与读取或写入字符和二进制字符串一样快。SQL Server 不必访问不同的页,就可读取或写入 BLOB 字符串。

如果 textntext image 字符串比所指定的限制或行中的可用空间大,则行中将存储指针。尽管需要满足以下条件,但是在行中存储 BLOB 字符串的条件仍然适用:数据行中必须有足够的空间来存放指针。

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

如果先启用了 text in row,则不会立即转换现有的 BLOB 字符串。仅当字符串被更新时才将其转换。同样,如果增加了 text in row 选项限制,则在更新数据行中已有的 textntext image 字符串之前,不对其转换以遵从新限制。

注意:

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

table 变量(包括返回 table 变量的函数)将自动启用 text in row 选项,并将 inline limit 值默认为 256 字节。此选项不可更改。

text in row 支持 TEXTPTRWRITETEXTUPDATETEXT READTEXT 函数。用户可以使用 SUBSTRING() 函数读取部分 BLOB,但是必须记住,各个行内文本指针之间具有不同的持续时间和数量限制。有关详细信息,请参阅 管理 ntexttext image 数据

<script type="text/Javascript"> var ExpCollDivStr = ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl08e6cf60f,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl08img,"; </script> 返回代码值

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

<script type="text/Javascript"> var ExpCollDivStr = ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl096657c1d,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl09img,"; </script> 权限

执行 sp_tableoption 要求具有表的 ALTER 权限。

<script type="text/Javascript"> var ExpCollDivStr = ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl10cd67260,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl10img,"; </script> 示例

以下示例指定了将 HumanResources.JobCandidate 表中的 xml 数据存储在行外。

USE AdventureWorks; GO EXEC sp_tableoption 'HumanResources.JobCandidate', 'large value types out of row', 1;


使用大值数据类型 

Microsoft SQL Server 2005 中引入了 max 说明符。此说明符增强了 varcharnvarchar varbinary 数据类型的存储能力。varchar(max)nvarchar(max) varbinary(max) 统称为大值数据类型。您可以使用大值数据类型来存储最大为 2^31-1 个字节的数据。

注意:

sp_tableoption 存储过程的 'large value types out of row' 选项设置为 OFF 时,大值类型的行内存储限制为 8000 个字节。当此选项设置为 ON 时,只在行内存储 16 字节的根。有关详细信息,请参阅 sp_tableoption (Transact-SQL)

大值数据类型在行为上和与之对应的较小的数据类型 varcharnvarchar varbinary 相似。这种相似使 SQL Server 能够更高效地存储和检索大型字符、Unicode 和二进制数据。

有了大值数据类型,使用 SQL Server 的方式是使用早期版本的 SQL Server 中的 textntext image 数据类型所不可能具有的。例如,在 SQL Server 2005 中,您可以定义能存储大量数据(最多可达 2^31 字节的字符、整数和 Unicode 数据)的变量。有关详细信息,请参阅 Transact-SQL 变量

下表说明了大值数据类型和 SQL Server 早期版本中与之对应的数据类型之间的关系。

大值数据类型

早期版本中的 LOB

varchar(max)

text*

nvarchar(max)

ntext*

varbinary(max)

image

* SQL Server  6.5 版本的客户端不支持 ntext 数据类型,因此无法识别 nvarchar(max)

重要事项:

请使用 varchar(max)nvarchar(max) varbinary(max) 数据类型,而不要使用 textntext image 数据类型。

大值数据类型在行为上和与之对应的较小的数据类型 varchar(n)nvarchar(n) varbinary(n) 相同。下面介绍大值数据类型在某些特定情形下的使用:

·             游标
由于可以定义大值数据类型变量,便可以将 FETCH 返回的大值数据类型列中的数据赋给本地变量。有关详细信息,请参阅 FETCH (Transact-SQL)
使用大值数据类型不影响游标的强制实施游标类型转换用法。

·             成块更新
UPDATE
语句现在支持 .WRITE( ) 子句对基础大值数据列进行部分更新。这类似于 SQL Server 早期版本中所支持的对 textntextimage 数据类型的文本指针操作、WRITETEXT UPDATETEX。有关详细信息,请参阅 UPDATE (Transact-SQL)

·             触发器
支持对插入的删除的表中的大值数据类型列引用上使用 AFTER 触发器。有关详细信息,请参阅 CREATE TRIGGER (Transact-SQL)

·             字符串函数
内置的可操作字符和二进制数据的字符串函数有所增强,可支持大值数据类型的参数。这些函数包括:

o                                    COL_LENGTH

o                                    CHARINDEX

o                                    PATINDEX

o                                    LEN

o                                    DATALENGTH

o                                    SUBSTRING

有关字符串函数的信息,请参阅字符串函数 (Transact-SQL)

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值