Was ist TEXTIMAGE_ON [PRIMARY]?

122

Ich habe an vielen Tischen gearbeitet und alle hatten dieses Ding:

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

Was ist TEXTIMAGE_ON [PRIMARY]in SQL Server / Transact-SQL?

Mitul Sheth
quelle
Sie können folgen diesem ..
Pugal

Antworten:

46

Aus dem MSDN

TEXTIMAGE_ON {Dateigruppe | "Standard" }

Gibt an, dass die benutzerdefinierten Spalten für Text, ntext, Bild, XML, varchar (max), nvarchar (max), varbinary (max) und CLR (einschließlich Geometrie und Geografie) in der angegebenen Dateigruppe gespeichert sind.

TEXTIMAGE_ON ist nicht zulässig, wenn die Tabelle keine großen Wertespalten enthält. TEXTIMAGE_ON kann nicht angegeben werden, wenn <partition_scheme>angegeben. Wenn "Standard" angegeben ist oder wenn TEXTIMAGE_ON überhaupt nicht angegeben ist, werden die Spalten mit großen Werten in der Standarddateigruppe gespeichert. Die Speicherung von Spaltendaten mit großem Wert, die in CREATE TABLE angegeben sind, kann nicht nachträglich geändert werden.

HINWEIS: In diesem Zusammenhang ist Standard kein Schlüsselwort. Es ist eine Kennung für die Standarddateigruppe und muss wie in TEXTIMAGE_ON "default" oder TEXTIMAGE_ON [default] getrennt werden. Wenn "Standard" angegeben ist, muss die Option QUOTED_IDENTIFIER für die aktuelle Sitzung aktiviert sein. Dies ist die Standardeinstellung.

Rahul Tripathi
quelle
93
Nicht verstanden!
Mitul Sheth
3
@MitulSheth: - Was ist dir nicht klar? Das Handbuch spricht alles, es wird verwendet, um die in der Dateigruppe gespeicherten Typen anzugeben
Rahul Tripathi
12
Kann jemand eine einfache Erklärung geben. MSDN scheint mir ein bisschen hoch zu sein!
Mitul Sheth
4
@RT Bedeutet das, dass wir es angeben sollten, wenn wir varchar (max) verwenden? Was ist, wenn wir es nicht tun?
Mitul Sheth
34
Wie üblich ist die Microsoft-Beschreibung im Frühling so klar wie das Wasser des Mississippi.
Suncat2000
209

Vorausgesetzt, das Format ist:

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

TEXTIMAGE bezieht sich auf alle großen / unbegrenzten Feldtypen: Text, ntext, Bild, XML, varchar (max), nvarchar (max), varbinary (max) und benutzerdefinierte CLR-Typspalten (einschließlich Geometrie und Geografie).

Dann müssen Sie wissen, was Dateien und Dateigruppen sind. Aus dem MSDN-Eintrag für Datenbankdateien und Dateigruppen :

Datei

Jede SQL Server-Datenbank verfügt mindestens über zwei Betriebssystemdateien: eine Datendatei und eine Protokolldatei. Datendateien enthalten Daten und Objekte wie Tabellen, Indizes, gespeicherte Prozeduren und Ansichten. Protokolldateien enthalten die Informationen, die zum Wiederherstellen aller Transaktionen in der Datenbank erforderlich sind. Datendateien können zu Zuordnungs- und Verwaltungszwecken in Dateigruppen zusammengefasst werden.

Dateigruppen

Jede Datenbank hat eine primäre Dateigruppe. Diese Dateigruppe enthält die primäre Datendatei und alle sekundären Dateien, die nicht in andere Dateigruppen eingefügt werden. Benutzerdefinierte Dateigruppen können erstellt werden, um Datendateien für Verwaltungs-, Datenzuordnungs- und Platzierungszwecke zu gruppieren.

So,

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

Scheint etwas redundant zu sein, da die genannten Spalten mit großem Textwert in der primären Dateigruppe gespeichert werden sollten, was eigentlich die Standardaktion ist.

Unter der Annahme, dass es eine benutzerdefinierte Dateigruppe namens CUSTOM gibt, würden Sie wahrscheinlich Folgendes schreiben:

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

Sie würden eine benutzerdefinierte Dateigruppe erstellen, um große Binärdateien oder Text zu speichern. In diesem Fall würden die Informationen zu "normalen" Feldern in einer Datendatei in der primären Dateigruppe gespeichert, während die zugehörigen "großen" Felder in einer physisch unterschiedlichen Datendatei gespeichert würden (in der sekundären benutzerdefinierten Dateigruppe).

Sie würden dies tun, um das relationale Kerndatenmodell (das vermutlich relativ klein im Hinblick auf den Speicherplatz wäre) von den großen Feldern (die proportional mehr Speicherplatz benötigen) zu trennen, um unterschiedliche Archivierungs- oder Replikationsstrategien zu ermöglichen auf jede Dateigruppe angewendet werden.

david.barkhuizen
quelle
39
Vielen Dank, dass Sie diese viel verständlichere Antwort als die akzeptierte gegeben haben!
Zero3
12
@Mitul Sheth Nie zu spät, um eine bessere richtige Antwort zu wählen :)
Umgekehrter Ingenieur
1

Wenn Sie keine großen Textspalten haben, z. B. Text, ntext, Bild, XML, varchar (max), nvarchar (max), varbinary (max) und CLR, können Sie einfach Folgendes verwenden:

CREATE TABLE Persons(
[id] [int] IDENTITY(1,1) NOT NULL,
[modified_on] [datetime] NULL,
[modified_by] [varchar](200) NULL,)ON [PRIMARY]
denford mutseriwa
quelle
2
Nachricht 156, Ebene 15, Status 1, Zeile 12 Falsche Syntax in der Nähe des Schlüsselworts 'TABLE'.
Umgekehrter Ingenieur
@ReversedEngineer Dieser Syntaxfehler wird durch das unnötige Komma am Ende von: [modified_by] [varchar](200) NULL
OrizG
@OrizG Sicher. Ich wollte dem Verfasser der Antwort nur helfen, seinen Beispielcode zu korrigieren. Völlig seltsam ist, dass der Syntaxfehler auf meinem Computer nicht mehr angezeigt wird (Microsoft SQL Server 2016 (SP2-CU12) (KB4536648) - 13.0.5698.0 (X64))
Reversed Engineer