Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

LEFT() срещу SET TEXTSIZE в SQL Server:Каква е разликата?

Може да сте запознати с SET TEXTSIZE оператор в SQL Server, който ви позволява да ограничите количеството данни, върнати в SELECT заявка.

Може би откривате, че резултатите са точно същите като LEFT() при изпълнение на конкретна заявка. Което повдига въпроса:Има ли разлика между тези две опции?

Определено има разлики между тези две опции. Има случаи, когато и двете функции ще върнат напълно различни резултати. Освен това има разлики в начина, по който работят, както и в типа данни, върху които могат да се използват.

Дефиниции

Нека започнем, като разгледаме какво прави всеки от тях.

LEFT()
Връща лявата част на низ от знаци с посочения брой знаци.
SET TEXTSIZE
Указва размера на varchar(max) , nvarchar(max) ,варбинарна(макс.) , текст , ntext , иизображение данни, върнати от SELECT изявление.

Нека разгледаме това подробно.

Символи спрямо размер на данните

Обърнете внимание на формулировката на всяко определение. По-специално думите „знаци“ срещу „размер“ и „данни“.

  • LEFT() ви позволява да посочите изрично колко знака се връщат.
  • SET TEXTSIZE ви позволява да посочите размера от върнатите данни.

Това е важно разграничение, което трябва да направите, защото ще получите различни резултати в зависимост от типа данни. Различните знаци могат да изискват различен размер на съхранение. Един знак може да използва 1 байт, а друг може да използва 2 байта.

Използване на LEFT() ще ви позволи да посочите броя на знаците, независимо колко байта използват.

SET TEXTSIZE от друга страна, ви позволява да посочите броя на байтовете да се върне –не цифрите.

Ако данните се съхраняват с помощта на nvarchar(max) например може да откриете, че SET TEXTSIZE връща половината от броя на знаците, които LEFT() прави.

Пример:

СЪЗДАВАНЕ НА ТАБЛИЦА TextSizeTest ( varchar50 varchar(50), varcharMax varchar(max), nvarcharMax nvarchar(max) ); INSERT INTO TextSizeTestVALUES ( 'Dragonfruit', 'Dragonfruit', 'Dragonfruit' );ЗАДАДЕТЕ TEXTSIZE 50; ИЗБЕРЕТЕ НАЛЯВО(varchar50, 4) КАТО varchar50, LEFT(varcharMax, 4) КАТО varcharMax, LEXizeMaxTvarx; SET TEXTSIZE 4;SELECT * FROM TextSizeTest;

Резултат:

+------------+--------------+--------------+| varchar50 | varcharMax | nvarcharMax ||------------+--------------+---------------|| Плъзнете | Плъзнете | Плъзнете |+------------+--------------+--------------+(1 засегнат ред) Командите са завършени успешно.+------------+--------------+------------ --+| varchar50 | varcharMax | nvarcharMax ||------------+--------------+---------------|| Драконов плод | Плъзнете | Д-р |+-----------+--------------+--------------+(1 засегнат ред)

Първият резултат е за LEFT() . Работи и за трите типа и размера данни. Връща точния брой посочени знаци.

Вторият резултат е за SET TEXTSIZE . Това не засяга varchar(50) резултати. Засяга само другите две. Но това им се отразява различно. Заvarchar(max) , всеки знак използва 1 байт и така получаваме същия брой символи, върнати като посочения TEXTSIZE . За nvarchar(max) това е различна история. Всеки знак използва 2 байта и така получаваме само половината от върнатите знаци.

Резултатите обаче, върнати от LEFT() все още потенциално може да бъде засегнат от SET TEXTSIZE . Ако стартирам LEFT() запитайте отново, но го предхождайте с SET TEXTSIZE 2 , получаваме това:

ЗАДАДЕТЕ TEXTSIZE 2;ИЗБЕРЕТЕ НАЛЯВО(varchar50, 4) КАТО varchar50, LEFT(varcharMax, 4) КАТО varcharMax, LEFT(nvarcharMax, 4) КАТО nvarcharMaxFROM TextSizeTest;

Резултат:

+------------+--------------+--------------+| varchar50 | varcharMax | nvarcharMax ||------------+--------------+---------------|| Плъзнете | д-р | D |+------------+--------------+--------------+ 

Максимален размер на данните спрямо фиксиран размер на данни

Друга разлика е, че SET TEXTSIZE работи само на varchar(max) , nvarchar(max) ,варбинарна(макс.) , текст , ntext , иизображение данни. Обърнете внимание на max част. Ако използвате фиксиран размер на данните (като varchar(255) например), SET TEXTSIZE няма да работи.

LEFT() от друга страна, работи с всички символни данни с изключение на текст и ntext .

Можете да видите тези разлики в предишния пример. varchar(50) данните бяха засегнати от LEFT() но не и SET TEXTSIZE .

LEFT() е по-конкретно

Друга разлика е, че LEFT() се прилага само към колоната (или константа или променлива), която сте посочили. Ако искате да го приложите към множество колони/изрази, трябва да го включите отново за всеки израз. Същото с последващите запитвания.

SET TEXTSIZE от друга страна, се прилага към всички приложими колони, върнати в заявката. Също така се прилага към всички заявки, докато не бъде зададена на друга стойност.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да махна таблица, ако съществува?

  2. OPENROWSET не приема променливи за своите аргументи (SQL Server)

  3. Използвайте TYPE_NAME(), за да получите името на тип данни в SQL Server

  4. Автоматизиране на тестовото възстановяване на базата данни в SQL Server

  5. Връзката беше успешно установена със сървъра, но след това възникна грешка по време на ръкостискането преди влизане