sql server 2005数据库中为什么text类型为什么存储不了大量文字呢?

2024-12-15 10:33:28
推荐回答(3个)
回答1:

你可以考虑禁用 text in row 选项:
sp_tableoption N 'MyTable ', 'text in row ', 'OFF '

这时sql2000的资料,2005也差不多
Text in Row 数据
Microsoft® SQL Server™ 2000 支持在数据行中存储小型到中等的 text、ntext 和 image 值。该功能最适于这样的表:text、ntext 和 image 列中的数据通常读取或写入一个单元,并且大多数引用该表的语句都使用 text、ntext 和 image 数据。

除非指定 text in row 选项,否则 text、ntext 或 image 字符串为存储在数据行外的大型(最大 2GB)字符串或二进制字符串。数据行只包括一个 16 字节的文本指针,该指针指向一个树的根节点,该树由映射存储串片段的页的内部指针构成。有关 text、ntext 或 image 字符串存储的更多信息,请参见 text、ntext 和 image 数据。

可为包含 text、ntext 或 image 列的表设置 text in row 选项。还可以指定 text in row 选项限制,从 24 到 7,000 字节。如果设置了该选项,则在下列情况下,text、ntext 或 image 字符串直接存储在数据行中:

字符串的长度比指定的长度限制短。

数据行中有足够的可用空间容纳字符串。
当 text、ntext 或 image 串被存储在数据行时,SQL Server 就无须访问单独的页或页的集合来读写这些串。这使得读写 text、ntext 或 image 这些行中的串就象读写 varchar、 nvarchar 或 varbinary 串一样快。

如果 text、ntext 或 image 字符串的长度比 text in row 选项的限制或行中的可用空间长,则本应存储在指针树根节点中的指针集将存储在行中。下列情况下,将指针存储在行中:

存储指针所需的空间量比 text in row 选项限制指定的少。

数据行中有足够的可用空间容纳指针。
当指针从根节点移至行本身时,SQL Server 无须使用根节点。这可在读取或写入字符串时消除页访问,从而加快处理速度。

当使用根节点时,它们被存储为 text、ntext 或 image 页中的一个字符串片段,并且可最多容纳五个内部指针。SQL Server 的行需要 72 字节的空间存储行内字符串的五个指针。如果当 text in row 选项打开时行中没有足够的空间容纳指针,SQL Server 必须分配一个 8-K 页容纳它们。不应将 text in row 限制设置为小于 72 字节,除非确定存储在列中的所有字符串都较短或超过 3 MB。

当 text、ntext 或 image 字符串存储在行中时,它们的存储类似于长度可变的字符串。例如,如果 text in row 选项的限制为 500 字节,则在行中存储一个 200 字节的字符串时,SQL Server 将只使用存储该字符串所需的字节数。如果插入的字符串比 500 字节长,因而指针存储在行中,则 SQL Server 只使用足够容纳指针的空间,而不是全部 500 字节。

如果某个表有多个 text、ntext 或 image 列,则当尝试插入多个 text、ntext 或 image 字符串时,SQL Server 将按基于列 ID 的顺序给这些字符串逐个分配空间。例如,假设有一个包含四个 text 列的表,并且将 text in row 选项的限制设置为 1000。然后插入某行,而该行中每个 text 列都为 900 字节的字符串,并且有足够的数据用于表中的所有其它列,因此在行中只有 3,000 字节的可用空间容纳 text 字符串。前三个 text 列的字符串存储在行中,使用 3,000 可用字节中的 2,700 字节。第四个 text 列的字符串不存储在行中,但根节点的指针存储在行中。

启用和禁用 text in row 选项
可使用 sp_tableoption 为表启用 text in row 选项:

sp_tableoption N 'MyTable ', 'text in row ', 'ON '

或者,可以为可在数据行中存储的 text、ntext 和 image 字符串长度指定从 24 到 7.000 字节的最大限制:

sp_tableoption N 'MyTable ', 'text in row ', '1000 '

如果指定的是 on 而不是一个特定的限制,则此限制的默认值为 256 字节。该默认值使您得以从 text in row 选项中获得最多的性能收益。尽管在通常情况下,不应将此值设为低于 72,但也不应把此值设得过高,特别是对那些大多数语句都不引用 text、ntext 和 image 列的表或者具有多个 text、ntext 和 image 列的表。如果设置了较大的 text in row 限制,且行本身存储了许多字符串,则可以显著减少存储在每页上的数据行数。如果大多数引用表的语句不访问 text、ntext 或 image 列,则减少页中的行数会增加处理查询时必须读取的页数。减少每页上的行数会增加索引及页的大小,优化器找不到可用的索引时可能需要扫描这些索引和页。text in row 限制的默认值 256 足以确保小型字符串和根文本指针存储在行中,同时不会使每页上的行减少得太多以至影响性能。

也可以使用 sp_tableoption 关闭此选项,这可以通过指定 off 或 0 选项值来实现:

sp_tableoption N 'MyTable ', 'text in row ', 'OFF '

text in row 选项的效果
text in row 选项具有下列效果:

打开 text in row 选项后,不能使用 READTEXT、UPDATETEXT 或 WRITETEXT 语句读取或修改存储在表中的任何 text、ntext 或 image 值的任何部分。在 SELECT 语句中可以读取整个 text、ntext 或 image 字符串,或者使用 SUBSTRING 函数读取部分字符串。所有引用表的 INSERT 或 UPDATE 语句必须指定完整的字符串,并且不能只修改 text、ntext 或 image 字符串的一部分。

当第一次启用 text in row 选项时,现有 text、ntext 或 image 字符串不会立即转换成行内字符串。仅当随后更新字符串时,这些字符串才转换成行内字符串。在打开 text in row 选项后插入的任何 text、ntext 或 image 字符串将作为行内字符串插入。

关闭 text in row 选项可能是长时间运行的日志记录操作。表被锁定且所有行内 text、ntext 和 image 字符串都转换成常规 text、ntext 和 image 字符串。运行命令所需的时间和需要修改的数据量,取决于必须从行内字符串转换成常规字符串的 text、ntext 和 image 字符串的数量。

text in row 选项不影响用于 SQL Server 的 OLE DB 提供程序或 SQL Server ODBC 驱动程序的操作,而只会加快访问 text、ntext 和 image 数据的速度。

打开 text in row 选项后,DB-Library text 和 image 函数(如 dbreadtext 和 dbwritetext)不能在表上使用。
下列各项的 text in row 选项自动设置成 256:

含有表数据类型的变量。

由返回 table 的用户定义函数所返回的表。
不能更改该设置。

回答2:

text类型可以存储最大4亿字节的文字,是很庞大的,你所说的存不了,是不是写入时的SQL语法错误,比如写入时是按照字符串写入的,而字符串是用单引号括起来的,如果字符串里面也有引号,就会出现语法错误。
你可以用两个引号('')替换字符串里面的所有单引号。

回答3:

举例说明