Qu'est-ce que TEXTIMAGE_ON [PRIMARY]?

122

J'ai travaillé sur de nombreuses tables et toutes avaient cette chose:

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'est-ce que TEXTIMAGE_ON [PRIMARY]SQL Server / Transact-SQL?

Mitul Sheth
la source
vous pouvez suivre ceci ..
Pugal

Réponses:

46

Depuis le MSDN

TEXTIMAGE_ON {groupe de fichiers | "défaut" }

Indique que les colonnes de type text, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) et CLR (y compris la géométrie et la géographie) sont stockées dans le groupe de fichiers spécifié.

TEXTIMAGE_ON n'est pas autorisé s'il n'y a pas de colonnes de grande valeur dans la table. TEXTIMAGE_ON ne peut pas être spécifié si <partition_scheme>est spécifié. Si "default" est spécifié, ou si TEXTIMAGE_ON n'est pas du tout spécifié, les colonnes de grande valeur sont stockées dans le groupe de fichiers par défaut. Le stockage des données de colonne de grande valeur spécifiées dans CREATE TABLE ne peut pas être modifié ultérieurement.

REMARQUE: dans ce contexte, la valeur par défaut n'est pas un mot-clé. Il s'agit d'un identifiant pour le groupe de fichiers par défaut et doit être délimité, comme dans TEXTIMAGE_ON "default" ou TEXTIMAGE_ON [default]. Si "default" est spécifié, l'option QUOTED_IDENTIFIER doit être ON pour la session en cours. Ce sont les paramètres par défauts.

Rahul Tripathi
la source
93
Pas compris!
Mitul Sheth le
3
@MitulSheth: - Qu'est-ce qui n'est pas clair pour vous? Le manuel parle de tout, il est utilisé pour indiquer les types stockés dans le groupe de fichiers
Rahul Tripathi
12
Quelqu'un peut-il donner une explication simple. MSDN me semble un peu élevé!
Mitul Sheth
4
@RT Cela signifie-t-il que nous devrions le spécifier chaque fois que nous utilisons varchar (max)? Et si nous ne le faisons pas?
Mitul Sheth du
34
Comme d'habitude, la description de Microsoft est aussi claire que l'eau du fleuve Mississippi au printemps.
Suncat2000
210

Étant donné que le format est:

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

TEXTIMAGE fait référence à tous les types de champs de taille grande / illimitée: texte, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) et CLR (y compris la géométrie et la géographie).

Ensuite, vous devez savoir ce que sont les fichiers et les groupes de fichiers. À partir de l'entrée MSDN sur les fichiers de base de données et les groupes de fichiers :

Fichier

Au minimum, chaque base de données SQL Server possède deux fichiers de système d'exploitation: un fichier de données et un fichier journal. Les fichiers de données contiennent des données et des objets tels que des tables, des index, des procédures stockées et des vues. Les fichiers journaux contiennent les informations requises pour récupérer toutes les transactions de la base de données. Les fichiers de données peuvent être regroupés en groupes de fichiers à des fins d'attribution et d'administration.

Groupes de fichiers

Chaque base de données a un groupe de fichiers principal. Ce groupe de fichiers contient le fichier de données principal et tous les fichiers secondaires qui ne sont pas placés dans d'autres groupes de fichiers. Des groupes de fichiers définis par l'utilisateur peuvent être créés pour regrouper des fichiers de données à des fins d'administration, d'allocation de données et de placement.

Alors,

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

Cela semblerait quelque peu redondant, car il est dit que les colonnes de grande valeur de texte mentionnées doivent être stockées dans le groupe de fichiers principal, qui est en fait l'action par défaut.

En supposant l'existence d'un groupe de fichiers personnalisé appelé CUSTOM, vous écririez probablement quelque chose comme ceci:

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

Vous créeriez un groupe de fichiers personnalisé pour stocker de gros fichiers binaires ou du texte, et dans ce cas, les informations des champs `` normaux '' se trouveraient dans un fichier de données dans le groupe de fichiers principal, tandis que les `` grands '' champs associés seraient stockés dans un fichier de données physiquement distinct (dans le groupe de fichiers personnalisé secondaire).

Vous feriez cela pour pouvoir séparer le modèle de données relationnel de base (qui serait probablement relativement petit en termes d'espace disque) des grands champs (qui nécessiteront proportionnellement plus d'espace disque) - afin de permettre à des stratégies d'archivage ou de réplication distinctes de être appliqué à chaque groupe de fichiers.

david.barkhuizen
la source
39
Merci d'avoir fourni cette réponse beaucoup plus compréhensible que celle acceptée!
Zero3
12
@Mitul Sheth Jamais trop tard pour choisir une meilleure réponse correcte :)
Ingénieur inversé
1

Si vous n'avez pas de grandes colonnes de texte, c'est-à-dire text, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) et CLR, vous pouvez simplement utiliser:

CREATE TABLE Persons(
[id] [int] IDENTITY(1,1) NOT NULL,
[modified_on] [datetime] NULL,
[modified_by] [varchar](200) NULL,)ON [PRIMARY]
denford mutseriwa
la source
2
Msg 156, niveau 15, état 1, ligne 12 Syntaxe incorrecte près du mot-clé «TABLE».
Ingénieur inversé
@ReversedEngineer Cette erreur de syntaxe est causée par la virgule inutile à la fin de: [modified_by] [varchar](200) NULL
OrizG
@OrizG Bien sûr. Je voulais simplement aider l'auteur de la réponse à corriger son exemple de code. La chose totalement étrange est que cela ne donne plus l'erreur de syntaxe sur ma machine (Microsoft SQL Server 2016 (SP2-CU12) (KB4536648) - 13.0.5698.0 (X64))
Ingénieur inversé le