O que é TEXTIMAGE_ON [PRIMARY]?

122

Eu trabalhei em muitas mesas e todas tinham essa coisa:

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

O que há TEXTIMAGE_ON [PRIMARY]no SQL Server / Transact-SQL?

Mitul Sheth
fonte
você pode seguir isto ..
Pugal

Respostas:

46

Do MSDN

TEXTIMAGE_ON {grupo de arquivos | "padrão" }

Indica que as colunas do tipo texto, ntext, imagem, xml, varchar (max), nvarchar (max), varbinary (max) e CLR definidas pelo usuário (incluindo geometria e geografia) são armazenadas no grupo de arquivos especificado.

TEXTIMAGE_ON não é permitido se não houver colunas de valor grande na tabela. TEXTIMAGE_ON não pode ser especificado se <partition_scheme>estiver especificado. Se "padrão" for especificado ou se TEXTIMAGE_ON não for especificado, as colunas de grande valor serão armazenadas no grupo de arquivos padrão. O armazenamento de qualquer dado de coluna de valor grande especificado em CREATE TABLE não pode ser alterado posteriormente.

NOTA: Nesse contexto, o padrão não é uma palavra-chave. É um identificador para o grupo de arquivos padrão e deve ser delimitado, como em TEXTIMAGE_ON "padrão" ou TEXTIMAGE_ON [padrão]. Se "padrão" for especificado, a opção QUOTED_IDENTIFIER deverá estar LIGADA para a sessão atual. Esta é a configuração padrão.

Rahul Tripathi
fonte
93
Não entendido!
Mitul Sheth
3
@MitulSheth: - O que não está claro para você? O manual fala tudo, ele é usado para indicar os tipos armazenados no grupo de arquivos
Rahul Tripathi
12
Alguém pode dar uma explicação simples. MSDN parece um pouco alto para mim!
Mitul Sheth
4
@RT Isso significa que devemos especificá-lo sempre que usarmos varchar (max)? E se não o fizermos?
Mitul Sheth
34
Como de costume, a descrição da Microsoft é tão clara quanto a água do rio Mississippi na primavera.
Suncat2000
209

Dado que o formato é:

CREATE TABLE TableName(...) TEXTIMAGE_ON { filegroup | "default" }

TEXTIMAGE refere-se a todos os tipos de campos grandes / de tamanho ilimitado: texto, ntext, imagem, xml, varchar (max), nvarchar (max), varbinary (max) e colunas de tipo definido pelo usuário do CLR (incluindo geometria e geografia).

Então, você precisa saber o que são arquivos e grupos de arquivos. Na entrada MSDN em Arquivos e grupos de arquivos de banco de dados :

Arquivo

No mínimo, todo banco de dados do SQL Server possui dois arquivos do sistema operacional: um arquivo de dados e um arquivo de log. Os arquivos de dados contêm dados e objetos como tabelas, índices, procedimentos armazenados e visualizações. Os arquivos de log contêm as informações necessárias para recuperar todas as transações no banco de dados. Os arquivos de dados podem ser agrupados em grupos de arquivos para fins de alocação e administração.

Grupos de arquivos

Todo banco de dados tem um grupo de arquivos primário. Este grupo de arquivos contém o arquivo de dados primário e quaisquer arquivos secundários que não são colocados em outros grupos de arquivos. Grupos de arquivos definidos pelo usuário podem ser criados para agrupar arquivos de dados para fins administrativos, de alocação e colocação de dados.

Assim,

CREATE TABLE ... ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Parece ser um pouco redundante, pois está dizendo que as colunas de grande valor de texto mencionadas devem ser armazenadas no grupo de arquivos primário, que é realmente a ação padrão.

Supondo a existência de um grupo de arquivos personalizado chamado CUSTOM, você provavelmente escreveria algo como isto:

CREATE TABLE ... ON [PRIMARY] TEXTIMAGE_ON [CUSTOM]

Você criaria um grupo de arquivos personalizado para armazenar texto ou binário grande e, nesse caso, as informações dos campos 'normais' ficariam em um arquivo de dados no grupo de arquivos primário, enquanto os campos 'grandes' associados seriam armazenados em um arquivo de dados fisicamente distinto (no grupo de arquivos personalizado secundário).

Você faria isso para poder separar o modelo de dados relacional principal (que presumivelmente seria relativamente pequeno em termos de espaço em disco) dos campos grandes (que exigirão proporcionalmente mais espaço em disco) - para permitir estratégias distintas de arquivamento ou replicação. ser aplicado a cada grupo de arquivos.

david.barkhuizen
fonte
39
Obrigado por fornecer esta resposta muito mais compreensível do que a aceita!
Zero3
12
@Mitul Sheth Nunca é tarde demais para escolher uma melhor resposta correta :)
Engenheiro invertida
1

Se você não possui colunas de texto grandes, como texto, ntext, imagem, xml, varchar (max), nvarchar (max), varbinary (max) e CLR, basta usar:

CREATE TABLE Persons(
[id] [int] IDENTITY(1,1) NOT NULL,
[modified_on] [datetime] NULL,
[modified_by] [varchar](200) NULL,)ON [PRIMARY]
Denford Mutseriwa
fonte
2
Msg 156, Nível 15, Estado 1, Linha 12 Sintaxe incorreta perto da palavra-chave 'TABLE'.
Reversed Engineer
@ReversedEngineer Esse erro de sintaxe é causado pela vírgula desnecessária no final de: [modified_by] [varchar](200) NULL
OrizG
@OrizG Claro. Só queria ajudar o escritor da resposta a corrigir o código de exemplo. O que é absolutamente estranho é que não dá mais o erro de sintaxe na minha máquina (Microsoft SQL Server 2016 (SP2-CU12) (KB4536648) - 13.0.5698.0 (X64))
Reversed Engineer