Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE w SQL Server:jaka jest różnica?

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ść.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 sposoby na wyświetlenie listy wszystkich procedur składowanych w bazie danych SQL Server

  2. Szybko wstawiaj 2 miliony wierszy do SQL Server

  3. Jak mapować wiele partycji do jednej grupy plików w programie SQL Server (T-SQL)

  4. Jak uzyskać kolejną wartość sekwencji SQL Server w Entity Framework?

  5. Jak usunąć wiodące i końcowe znaki w SQL Server