Du kanske är bekant med SET TEXTSIZE
sats i SQL Server, som gör att du kan begränsa mängden data som returneras i en SELECT
fråga.
Du kanske upptäcker att dess resultat är exakt samma som LEFT()
när du kör en specifik fråga. Vilket väcker frågan:Finns det någon skillnad mellan dessa två alternativ?
Det finns definitivt skillnader mellan dessa två alternativ. Det finns fall där båda funktionerna ger helt olika resultat. Och det finns också skillnader i hur de fungerar, liksom vilken typ av data de kan användas på.
Definitioner
Låt oss börja med att titta på vad var och en gör.
LEFT()
- Returnerar den vänstra delen av en teckensträng med det angivna antalet tecken.
SET TEXTSIZE
- Anger storleken på varchar(max) , nvarchar(max) , varbinary(max) , text , ntext och bild data som returneras av en
SELECT
uttalande.
Låt oss undersöka detta i detalj.
Tecken kontra datastorlek
Var uppmärksam på formuleringen av varje definition. I synnerhet orden "tecken" vs "storlek" och "data".
LEFT()
gör det möjligt för dig att uttryckligen ange hur många tecken returneras.SET TEXTSIZE
gör att du kan ange storlek av de returnerade uppgifterna.
Detta är en viktig skillnad att göra, eftersom du får olika resultat beroende på datatyp. Olika tecken kan kräva olika lagringsstorlek. Ett tecken kan använda 1 byte och ett annat kan använda 2 byte.
Använder LEFT()
låter dig ange antalet tecken, oavsett hur många byte de använder.
SET TEXTSIZE
å andra sidan låter dig ange antalet byte att återvända – inte siffertecknen.
Om data lagras med nvarchar(max) till exempel kan du hitta att SET TEXTSIZE
returnerar hälften av antalet tecken som LEFT()
gör.
Exempel:
SKAPA TABELL TextSizeTest ( varchar50 varchar(50), varcharMax varchar(max), nvarcharMax nvarchar(max) ); INSERT INTO TextSizeTestVALUES ( 'Dragonfruit', 'Dragonfruit', 'Dragonfruit' );SET TEXTSTORLEK 50;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) ASROM varcharMax, LEFT(nvarcharMax, 4SxText ASFn; SET TEXTSIZE 4;SELECT * FROM TextSizeTest;
Resultat:
+-------------+--------------+--------------+| varchar50 | varcharMax | nvarcharMax ||-------------+------------------------------|| Dra | Dra | Dra |+-------------+--------------+---------------+(1 rad påverkad)Kommandon har slutförts.+---------------------------------- --+| varchar50 | varcharMax | nvarcharMax ||-------------+------------------------------|| Dragonfruit | Dra | Dr |+-------------+--------------+---------------+(1 rad påverkad)
Det första resultatet är för LEFT()
. Det fungerar över alla tre datatyper och storlekar. Den returnerar det exakta antalet angivna tecken.
Det andra resultatet är för SET TEXTSIZE
. Det påverkar inte varchar(50) resultat. Det påverkar bara de andra två. Men det påverkar dem olika. För varchar(max) , varje tecken använder 1 byte, så vi får samma antal tecken som returneras som den angivna TEXTSIZE
. För nvarchar(max) det är en annan historia. Varje tecken använder 2 byte, så vi får bara hälften av antalet tecken tillbaka.
Men resultaten returneras av LEFT()
kan fortfarande potentiellt påverkas av SET TEXTSIZE
. Om jag kör LEFT()
fråga igen, men föregå den med SET TEXTSIZE 2
, vi får detta:
SET TEXTSIZE 2;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest;
Resultat:
+-------------+--------------+--------------+| varchar50 | varcharMax | nvarcharMax ||-------------+------------------------------|| Dra | Dr | D |+-------------+--------------+--------------+Max datastorlek kontra fast datastorlek
En annan skillnad är att
SET TEXTSIZE
fungerar bara på varchar(max) , nvarchar(max) , varbinary(max) , text , ntext och bild data. Noteramax
del. Om du använder en fast datastorlek (somvarchar(255)
till exempel),SET TEXTSIZE
fungerar inte.
LEFT()
fungerar å andra sidan med all teckendata utom text och ntext .Du kan se dessa skillnader i föregående exempel. varchar(50) data påverkades av
LEFT()
men inteSET TEXTSIZE
.LEFT() är mer specifik
En annan skillnad är att
LEFT()
tillämpas endast på kolumnen (eller konstanten eller variabeln) du anger. Om du vill tillämpa det på flera kolumner/uttryck måste du inkludera det igen för varje uttryck. Samma sak med efterföljande frågor.
SET TEXTSIZE
å andra sidan tillämpas på alla tillämpliga kolumner som returneras i frågan. Den tillämpas också på alla frågor tills den har ställts in på ett annat värde.