什么是TEXTIMAGE_ON [PRIMARY]?

Mit*_*eth 111 sql-server

我在很多桌子上工作,所有人都有这个东西:

CREATE TABLE Persons(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [modified_on] [datetime] NULL,
    [modified_by] [varchar](200) NULL,
) 
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

什么是TEXTIMAGE_ON [PRIMARY]SQL Server/Transact-SQL?

dav*_*zen 178

鉴于格式是:

CREATE TABLE TableName(...) TEXTIMAGE_ON { filegroup | "default" }
Run Code Online (Sandbox Code Playgroud)

TEXTIMAGE 指所有大/无限大小的字段类型:text,ntext,image,xml,varchar(max),nvarchar(max),varbinary(max)和CLR用户定义类型列(包括几何和地理).

然后,您需要知道文件和文件组是什么.从数据库文件和文件组的MSDN条目:

文件

每个SQL Server数据库至少有两个操作系统文件:数据文件和日志文件.数据文件包含数据和对象,例如表,索引,存储过程和视图.日志文件包含恢复数据库中所有事务所需的信息.数据文件可以在文件组中组合在一起,以进行分配和管理.

文件组

每个数据库都有一个主文件组.此文件组包含主数据文件和未放入其他文件组的任何辅助文件.可以创建用户定义的文件组以将数据文件组合在一起,以进行管理,数据分配和放置.

所以,

CREATE TABLE ... ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

看起来有些多余,因为它说所提到的大文本值列应该存储在主文件组中,这实际上是默认操作.

假设存在一个名为CUSTOM的自定义文件组,您可能会编写如下内容:

CREATE TABLE ... ON [PRIMARY] TEXTIMAGE_ON [CUSTOM]
Run Code Online (Sandbox Code Playgroud)

您将创建一个自定义文件组来存储大型二进制文件或文本,在这种情况下,"普通"字段信息将位于主文件组中的数据文件中,而关联的"大"字段将存储在物理上不同的数据文件中(在辅助自定义文件组中).

您可以这样做,以便您可以将核心关系数据模型(在磁盘空间方面可能相对较小)与大字段(需要按比例增加磁盘空间)分开 - 以便允许不同的归档或复制策略应用于每个文件组.

  • 感谢您提供这个*比可接受的答案更容易理解的答案! (32认同)
  • @Mitul Sheth永远不会太晚选择更好的正确答案:) (8认同)
  • 是的,这应该是公认的答案. (5认同)

Rah*_*thi 44

来自MSDN

TEXTIMAGE_ON {filegroup | "默认"}

指示text,ntext,image,xml,varchar(max),nvarchar(max),varbinary(max)和CLR用户定义类型列(包括几何和地理)存储在指定的文件组中.

如果表中没有大值列,则不允许使用TEXTIMAGE_ON.如果指定,则无法指定TEXTIMAGE_ON <partition_scheme>.如果指定了"default",或者根本未指定TEXTIMAGE_ON,则大值列将存储在默认文件组中.无法随后更改CREATE TABLE中指定的任何大值列数据的存储.

注意:在此上下文中,default不是关键字.它是默认文件组的标识符,必须分隔,如TEXTIMAGE_ON"default"或TEXTIMAGE_ON [default].如果指定了"default",则当前会话的QUOTED_IDENTIFIER选项必须为ON.这是默认设置.

  • 不明白! (74认同)
  • 像往常一样,微软的描述与春天的密西西比河水一样清晰. (18认同)
  • 任何人都可以给出简单的解释.MSDN对我来说似乎有点高! (10认同)
  • @MitulSheth: - 你有什么不清楚的?手册说明了一切,它用于指示存储在文件组中的类型 (3认同)
  • @RT这是否意味着我们应该在每次使用varchar(max)时指定它?如果我们不怎么办? (3认同)