Може да сте запознати с 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
от друга страна, се прилага към всички приложими колони, върнати в заявката. Също така се прилага към всички заявки, докато не бъде зададена на друга стойност.