Być może znasz SET TEXTSIZE
instrukcja w SQL Server, która umożliwia ograniczenie ilości danych zwracanych w SELECT
zapytanie.
Być może okazuje się, że jego wyniki są dokładnie takie same jak w przypadku LEFT()
podczas uruchamiania konkretnego zapytania. Co nasuwa pytanie:czy jest różnica między tymi dwiema opcjami?
Te dwie opcje zdecydowanie różnią się między sobą. Zdarzają się przypadki, w których obie funkcje zwrócą zupełnie różne wyniki. Istnieją również różnice w sposobie ich działania, a także w rodzaju danych, na których można ich używać.
Definicje
Zacznijmy od przyjrzenia się, co każdy z nich robi.
LEFT()
- Zwraca lewą część ciągu znaków o określonej liczbie znaków.
SET TEXTSIZE
- Określa rozmiar varchar(max) , nvarchar(maks.) , zmienna (maks.) , tekst , ntekst i obraz dane zwrócone przez
SELECT
oświadczenie.
Przyjrzyjmy się temu szczegółowo.
Znaki a rozmiar danych
Zwróć uwagę na brzmienie każdej definicji. W szczególności słowa „znaki” kontra „rozmiar” i „dane”.
LEFT()
umożliwia jednoznaczne określenie liczby znaków są zwracane.SET TEXTSIZE
umożliwia określenie rozmiaru zwróconych danych.
Jest to ważne rozróżnienie, ponieważ otrzymasz różne wyniki w zależności od typu danych. Różne znaki mogą wymagać innego rozmiaru pamięci. Jeden znak może używać 1 bajtu, a inny może używać 2 bajtów.
Używanie LEFT()
pozwoli ci określić liczbę znaków, niezależnie od tego, ile bajtów używają.
SET TEXTSIZE
z drugiej strony pozwala określić liczbę bajtów wrócić – nie liczba znaków.
Jeśli dane są przechowywane przy użyciu nvarchar(max) na przykład może się okazać, że SET TEXTSIZE
zwraca połowę liczby znaków, które LEFT()
robi.
Przykład:
CREATE TABLE TextSizeTest ( varchar50 varchar(50), varcharMax varchar(max), nvarcharMax nvarchar(max) ); INSERT INTO TextSizeTest VALUES ( 'Dragonfruit', 'Dragonfruit', 'Dragonfruit' ); SET TEXTSIZE 50; SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMax FROM TextSizeTest; SET TEXTSIZE 4; SELECT * FROM TextSizeTest;
Wynik:
+-------------+--------------+---------------+ | varchar50 | varcharMax | nvarcharMax | |-------------+--------------+---------------| | Drag | Drag | Drag | +-------------+--------------+---------------+ (1 row affected) Commands completed successfully. +-------------+--------------+---------------+ | varchar50 | varcharMax | nvarcharMax | |-------------+--------------+---------------| | Dragonfruit | Drag | Dr | +-------------+--------------+---------------+ (1 row affected)
Pierwszy wynik dotyczy LEFT()
. Działa we wszystkich trzech typach i rozmiarach danych. Zwraca dokładną liczbę określonych znaków.
Drugi wynik to SET TEXTSIZE
. Nie wpływa na varchar(50) wyniki. Dotyczy tylko dwóch pozostałych. Ale to wpływa na nich inaczej. Dla varchar(max) , każdy znak używa 1 bajtu, więc otrzymujemy taką samą liczbę znaków, jaka jest w określonym TEXTSIZE
. Dla nvarchar(maks.) to inna historia. Każdy znak używa 2 bajtów, więc otrzymujemy tylko połowę liczby zwracanych znaków.
Jednak wyniki zwrócone przez LEFT()
może nadal potencjalnie podlegać SET TEXTSIZE
. Jeśli uruchomię LEFT()
zapytanie ponownie, ale poprzedź je przed SET TEXTSIZE 2
, otrzymujemy to:
SET TEXTSIZE 2; SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMax FROM TextSizeTest;
Wynik:
+-------------+--------------+---------------+ | varchar50 | varcharMax | nvarcharMax | |-------------+--------------+---------------| | Drag | Dr | D | +-------------+--------------+---------------+
Maksymalny rozmiar danych a stały rozmiar danych
Kolejną różnicą jest to, że SET TEXTSIZE
działa tylko na varchar(max) , nvarchar(maks.) , zmienna (maks.) , tekst , ntekst i obraz dane. Zwróć uwagę na max
część. Jeśli używasz stałego rozmiaru danych (takiego jak varchar(255)
na przykład), SET TEXTSIZE
nie zadziała.
LEFT()
z drugiej strony działa ze wszystkimi danymi znakowymi z wyjątkiem tekstu i ntext .
Możesz zobaczyć te różnice w poprzednim przykładzie. varchar(50) na dane wpłynęła funkcja LEFT()
ale nie SET TEXTSIZE
.
LEFT() jest bardziej szczegółowa
Kolejną różnicą jest to, że LEFT()
jest stosowany tylko do określonej kolumny (lub stałej lub zmiennej). Jeśli chcesz zastosować go do wielu kolumn/wyrażeń, musisz dołączyć go ponownie dla każdego wyrażenia. To samo z kolejnymi zapytaniami.
SET TEXTSIZE
z drugiej strony jest stosowany do wszystkich odpowiednich kolumn zwróconych w zapytaniu. Jest również stosowany do wszystkich zapytań, dopóki nie zostanie ustawiona inna wartość.