¿Qué es TEXTIMAGE_ON [PRIMARY]?

122

Trabajé en muchas tablas y todas tenían esto:

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

¿Qué hay TEXTIMAGE_ON [PRIMARY]en SQL Server / Transact-SQL?

Mitul Sheth
fuente
puedes seguir esto ..
Pugal

Respuestas:

46

Desde MSDN

TEXTIMAGE_ON {grupo de archivos | "defecto" }

Indica que las columnas de tipo definido por el usuario text, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) y CLR (incluidas geometría y geografía) se almacenan en el grupo de archivos especificado.

TEXTIMAGE_ON no se permite si no hay columnas de valores grandes en la tabla. TEXTIMAGE_ON no se puede especificar si <partition_scheme>se especifica. Si se especifica "predeterminado", o si TEXTIMAGE_ON no se especifica en absoluto, las columnas de valores grandes se almacenan en el grupo de archivos predeterminado. El almacenamiento de cualquier dato de columna de gran valor especificado en CREATE TABLE no se puede modificar posteriormente.

NOTA: En este contexto, el valor predeterminado no es una palabra clave. Es un identificador para el grupo de archivos predeterminado y debe estar delimitado, como en TEXTIMAGE_ON "predeterminado" o TEXTIMAGE_ON [predeterminado]. Si se especifica "predeterminado", la opción QUOTED_IDENTIFIER debe estar activada para la sesión actual. Ésta es la configuración predeterminada.

Rahul Tripathi
fuente
93
¡No se entiende!
Mitul Sheth
3
@MitulSheth: - ¿Qué no te queda claro? El manual lo dice todo, se usa para indicar los tipos almacenados en el grupo de archivos
Rahul Tripathi
12
¿Alguien puede dar una explicación simple? ¡MSDN me parece un poco alto!
Mitul Sheth
4
@RT ¿Significa que debemos especificarlo siempre que usemos varchar (max)? ¿Y si no lo hacemos?
Mitul Sheth
34
Como de costumbre, la descripción de Microsoft es tan clara como el agua del río Mississippi en primavera.
Suncat2000
210

Dado que el formato es:

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

TEXTIMAGE se refiere a todos los tipos de campos grandes / de tamaño ilimitado: text, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) y columnas de tipo definido por el usuario CLR (incluidas geometría y geografía).

Entonces, necesita saber qué son archivos y grupos de archivos. Desde la entrada de MSDN en Archivos de base de datos y grupos de archivos :

Expediente

Como mínimo, cada base de datos de SQL Server tiene dos archivos de sistema operativo: un archivo de datos y un archivo de registro. Los archivos de datos contienen datos y objetos como tablas, índices, procedimientos almacenados y vistas. Los archivos de registro contienen la información necesaria para recuperar todas las transacciones en la base de datos. Los archivos de datos se pueden agrupar en grupos de archivos con fines de asignación y administración.

Grupos de archivos

Cada base de datos tiene un grupo de archivos principal. Este grupo de archivos contiene el archivo de datos principal y los archivos secundarios que no se colocan en otros grupos de archivos. Se pueden crear grupos de archivos definidos por el usuario para agrupar archivos de datos con fines administrativos, de asignación de datos y de ubicación.

Entonces,

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

Parecería ser algo redundante, ya que dice que las columnas de valores de texto grandes mencionadas deben almacenarse dentro del grupo de archivos principal, que en realidad es la acción predeterminada.

Suponiendo la existencia de un grupo de archivos personalizado llamado CUSTOM, probablemente escribiría algo como esto:

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

Debería crear un grupo de archivos personalizado para almacenar texto o binario grande, y en este caso la información de los campos 'normales' se ubicaría en un archivo de datos en el grupo de archivos principal, mientras que los campos 'grandes' asociados se almacenarían en un archivo de datos físicamente distinto (en el grupo de archivos personalizado secundario).

Debería hacer esto para poder separar el modelo de datos relacional central (que presumiblemente sería relativamente pequeño en términos de espacio en disco) de los campos grandes (que requerirán proporcionalmente más espacio en disco), para permitir distintas estrategias de archivado o replicación. aplicarse a cada grupo de archivos.

david.barkhuizen
fuente
39
¡Gracias por brindar esta respuesta mucho más comprensible que la aceptada!
Zero3
12
@Mitul Sheth Nunca es tarde para elegir una mejor respuesta correcta :)
Ingeniero invertido
1

Si no tiene columnas de texto grandes, es decir, text, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) y CLR, entonces puede usar:

CREATE TABLE Persons(
[id] [int] IDENTITY(1,1) NOT NULL,
[modified_on] [datetime] NULL,
[modified_by] [varchar](200) NULL,)ON [PRIMARY]
Denford Mutseriwa
fuente
2
Msg 156, nivel 15, estado 1, línea 12 Sintaxis incorrecta cerca de la palabra clave 'TABLE'.
Ingeniero
@ReversedEngineer Ese error de sintaxis es causado por la coma innecesaria al final de: [modified_by] [varchar](200) NULL
OrizG
@OrizG Seguro. Solo quería ayudar al escritor de la respuesta a corregir su código de muestra. Lo totalmente extraño es que ya no da el error de sintaxis en mi máquina (Microsoft SQL Server 2016 (SP2-CU12) (KB4536648) - 13.0.5698.0 (X64))
Ingeniero