Co to jest TEXTIMAGE_ON [PRIMARY]?

122

Pracowałem na wielu stołach i wszyscy mieli to:

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

Co znajduje się TEXTIMAGE_ON [PRIMARY]w SQL Server / Transact-SQL?

Mitul Sheth
źródło
możesz śledzić to ..
Pugal

Odpowiedzi:

46

Z MSDN

TEXTIMAGE_ON {filegroup | "domyślna" }

Wskazuje, że kolumny text, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) i CLR typu zdefiniowanego przez użytkownika (w tym geometria i geografia) są przechowywane w określonej grupie plików.

TEXTIMAGE_ON jest niedozwolone, jeśli w tabeli nie ma kolumn o dużej wartości. Nie można określić TEXTIMAGE_ON, jeśli <partition_scheme>jest określony. Jeśli określono wartość „default” lub w ogóle nie określono TEXTIMAGE_ON, kolumny o dużej wartości są przechowywane w domyślnej grupie plików. Nie można później zmienić miejsca przechowywania danych kolumn o dużej wartości określonych w CREATE TABLE.

UWAGA: W tym kontekście default nie jest słowem kluczowym. Jest to identyfikator domyślnej grupy plików i musi być rozdzielany, jak w TEXTIMAGE_ON „default” lub TEXTIMAGE_ON [default]. Jeśli określono wartość „default”, opcja QUOTED_IDENTIFIER musi być włączona dla bieżącej sesji. To jest ustawienie domyślne.

Rahul Tripathi
źródło
93
Nie rozumiem!
Mitul Sheth,
3
@MitulSheth: - Co nie jest dla ciebie jasne? Instrukcja mówi wszystko, służy do wskazania typów przechowywanych w grupie plików
Rahul Tripathi
12
Czy ktoś może podać proste wyjaśnienie. MSDN wydaje mi się trochę za wysokie!
Mitul Sheth,
4
@RT Czy to oznacza, że ​​powinniśmy go podawać za każdym razem, gdy używamy varchar (max)? A jeśli tego nie zrobimy?
Mitul Sheth,
34
Jak zwykle opis Microsoftu jest tak jasny jak woda w rzece Mississippi wiosną.
Suncat2000
210

Biorąc pod uwagę, że format jest następujący:

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

TEXTIMAGE odnosi się do wszystkich typów pól o dużym / nieograniczonym rozmiarze: tekst, ntext, obraz, xml, varchar (max), nvarchar (max), varbinary (max) i kolumny typu zdefiniowanego przez użytkownika CLR (w tym geometria i geografia).

Następnie musisz wiedzieć, jakie są pliki i grupy plików. Z wpisu MSDN dotyczącego plików bazy danych i grup plików :

Plik

Co najmniej każda baza danych SQL Server zawiera dwa pliki systemu operacyjnego: plik danych i plik dziennika. Pliki danych zawierają dane i obiekty, takie jak tabele, indeksy, procedury składowane i widoki. Pliki dziennika zawierają informacje wymagane do odzyskania wszystkich transakcji w bazie danych. Pliki danych można grupować w grupy plików do celów alokacji i administrowania.

Filegroups

Każda baza danych ma podstawową grupę plików. Ta grupa plików zawiera podstawowy plik danych i wszystkie pliki pomocnicze, które nie są umieszczane w innych grupach plików. Można tworzyć grupy plików zdefiniowane przez użytkownika, aby grupować pliki danych w celach administracyjnych, alokacji danych i umieszczania.

Więc,

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

Wydawałoby się, że jest nieco zbędny, ponieważ mówi, że wspomniane kolumny z dużymi wartościami tekstowymi powinny być przechowywane w podstawowej grupie plików, co jest w rzeczywistości akcją domyślną.

Zakładając istnienie niestandardowej grupy plików o nazwie CUSTOM, prawdopodobnie napisałbyś coś takiego:

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

Utworzyłbyś niestandardową grupę plików do przechowywania dużych plików binarnych lub tekstowych, aw tym przypadku informacje o „normalnych” polach znajdowałyby się w pliku danych w podstawowej grupie plików, podczas gdy powiązane „duże” pola byłyby przechowywane w fizycznie odrębnym pliku danych (w dodatkowej niestandardowej grupie plików).

Zrobiłbyś to, abyś mógł oddzielić podstawowy relacyjny model danych (który przypuszczalnie byłby stosunkowo mały pod względem miejsca na dysku) od dużych pól (które będą wymagały proporcjonalnie więcej miejsca na dysku) - aby umożliwić różne strategie archiwizacji lub replikacji być stosowane do każdej grupy plików.

david.barkhuizen
źródło
39
Dziękuję za udzielenie tej dużo bardziej zrozumiałej odpowiedzi niż zaakceptowana!
Zero3
12
@Mitul Sheth Nigdy nie jest za późno, aby wybrać lepszą, poprawną odpowiedź :)
Reversed Engineer
1

Jeśli nie masz żadnych dużych kolumn tekstowych, tj. Text, ntext, image, xml, varchar (max), nvarchar (max), varbinary (max) i CLR, możesz po prostu użyć:

CREATE TABLE Persons(
[id] [int] IDENTITY(1,1) NOT NULL,
[modified_on] [datetime] NULL,
[modified_by] [varchar](200) NULL,)ON [PRIMARY]
denford mutseriwa
źródło
2
Msg 156, poziom 15, stan 1, wiersz 12 Niepoprawna składnia w pobliżu słowa kluczowego „TABLE”.
Reversed Engineer
@ReversedEngineer Ten błąd składni jest spowodowany niepotrzebnym przecinkiem na końcu: [modified_by] [varchar](200) NULL
OrizG
@OrizG Jasne. Chciałem tylko pomóc autorowi odpowiedzi naprawić przykładowy kod. Całkowicie dziwne jest to, że nie daje już błędu składni na moim komputerze (Microsoft SQL Server 2016 (SP2-CU12) (KB4536648) - 13.0.5698.0 (X64))
Reversed Engineer