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
SELECToś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 TEXTSIZEumoż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ść.