Che cos'è TEXTIMAGE_ON [PRIMARY]?


122

Ho lavorato su molti tavoli e tutti avevano questa cosa:

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

Cosa c'è TEXTIMAGE_ON [PRIMARY]in SQL Server / Transact-SQL?


puoi seguire questo ..
Pugal

Risposte:


46

Da MSDN

TEXTIMAGE_ON {filegroup | "predefinito" }

Indica che le colonne di tipo text, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) e CLR definite dall'utente (incluse geometria e geografia) sono archiviate nel filegroup specificato.

TEXTIMAGE_ON non è consentito se non sono presenti colonne con valori di grandi dimensioni nella tabella. TEXTIMAGE_ON non può essere specificato se <partition_scheme>è specificato. Se viene specificato "default" o se TEXTIMAGE_ON non è specificato affatto, le colonne con valori grandi vengono archiviate nel filegroup predefinito. La memorizzazione di tutti i dati della colonna di valore elevato specificati in CREATE TABLE non può essere modificata successivamente.

NOTA: in questo contesto, l'impostazione predefinita non è una parola chiave. È un identificatore per il filegroup predefinito e deve essere delimitato, come in TEXTIMAGE_ON "predefinito" o TEXTIMAGE_ON [predefinito]. Se viene specificato "default", l'opzione QUOTED_IDENTIFIER deve essere ON per la sessione corrente. Questa è l'impostazione predefinita.


93
Non compreso!
Mitul Sheth,

3
@ MitulSheth: - Cosa non ti è chiaro? Il manuale dice tutto, è usato per indicare i tipi memorizzati nel filegroup
Rahul Tripathi

12
Qualcuno può dare una semplice spiegazione. MSDN sembra un po 'alto per me!
Mitul Sheth,

4
@RT Significa che dovremmo specificarlo ogni volta che usiamo varchar (max)? E se non lo facessimo?
Mitul Sheth,

34
Come al solito, la descrizione di Microsoft è chiara come l'acqua del fiume Mississippi in primavera.
Suncat2000

210

Dato che il formato è:

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

TEXTIMAGE si riferisce a tutti i tipi di campo di dimensioni grandi / illimitate: testo, ntext, immagine, xml, varchar (max), nvarchar (max), varbinary (max) e CLR colonne di tipo definito dall'utente (incluse geometria e geografia).

Quindi, è necessario sapere cosa sono File e FileGroup. Dalla voce MSDN su File di database e filegroup :

File

Ogni database SQL Server ha almeno due file del sistema operativo: un file di dati e un file di registro. I file di dati contengono dati e oggetti come tabelle, indici, stored procedure e viste. I file di registro contengono le informazioni necessarie per ripristinare tutte le transazioni nel database. I file di dati possono essere raggruppati in filegroup per scopi di allocazione e amministrazione.

filegroup

Ogni database ha un filegroup primario. Questo filegroup contiene il file di dati primario e tutti i file secondari che non vengono inseriti in altri filegroup. È possibile creare filegroup definiti dall'utente per raggruppare i file di dati per scopi amministrativi, di allocazione dei dati e di posizionamento.

Così,

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

Sembrerebbe essere in qualche modo ridondante, in quanto si dice che le colonne di valore di testo di grandi dimensioni menzionate dovrebbero essere memorizzate all'interno del filegroup primario, che in realtà è l'azione predefinita.

Supponendo l'esistenza di un filegroup personalizzato chiamato CUSTOM, probabilmente scriveresti qualcosa del genere:

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

Creeresti un filegroup personalizzato per memorizzare binario o testo di grandi dimensioni, e in questo caso le informazioni sui campi "normali" si troverebbero in un file di dati nel filegroup primario, mentre i campi "grandi" associati verrebbero memorizzati in un file di dati fisicamente distinto (nel filegroup personalizzato secondario).

Lo faresti in modo da poter separare il modello di dati relazionale di base (che presumibilmente sarebbe relativamente piccolo in termini di spazio su disco) dai campi grandi (che richiederanno proporzionalmente più spazio su disco) - al fine di consentire distinte strategie di archiviazione o replica essere applicato a ogni filegroup.


39
Grazie per aver fornito questa risposta molto più comprensibile di quella accettata!
Zero3

12
@ Mitul Sheth Non è mai troppo tardi per scegliere una risposta corretta migliore :)
Ingegnere inverso

1

Se non hai colonne di testo di grandi dimensioni, ad esempio text, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) e CLR, puoi semplicemente usare:

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

2
Msg 156, livello 15, stato 1, riga 12 Sintassi non corretta accanto alla parola chiave "TABLE".
Ingegnere invertito

@ReversedEngineer Questo errore di sintassi è causato dalla virgola non necessaria alla fine di: [modified_by] [varchar](200) NULL
OrizG

@OrizG Sure. Volevo solo aiutare l'autore della risposta a correggere il loro codice di esempio. La cosa assolutamente strana è che non dà più l'errore di sintassi sulla mia macchina (Microsoft SQL Server 2016 (SP2-CU12) (KB4536648) - 13.0.5698.0 (X64))
Reversed Engineer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.