Du er måske bekendt med SET TEXTSIZE
sætning i SQL Server, der giver dig mulighed for at begrænse mængden af data, der returneres i en SELECT
forespørgsel.
Måske opdager du, at dens resultater er nøjagtig de samme som LEFT()
når du kører en specifik forespørgsel. Hvilket rejser spørgsmålet:Er der forskel på disse to muligheder?
Der er bestemt forskelle mellem disse to muligheder. Der er tilfælde, hvor begge funktioner vil returnere helt forskellige resultater. Og der er også forskelle i, hvordan de fungerer, såvel som den type data, de kan bruges på.
Definitioner
Lad os starte med at se på, hvad hver enkelt gør.
LEFT()
- Returnerer den venstre del af en tegnstreng med det angivne antal tegn.
SET TEXTSIZE
- Specificerer størrelsen på varchar(max) , nvarchar(max) , varbinary(max) , tekst , ntekst og billede data returneret af en
SELECT
erklæring.
Lad os undersøge dette i detaljer.
Tegn vs. datastørrelse
Vær opmærksom på ordlyden af hver definition. Især ordene "karakterer" vs "størrelse" og "data".
LEFT()
giver dig mulighed for eksplicit at angive, hvor mange tegn er returneret.SET TEXTSIZE
giver dig mulighed for at angive størrelsen af de returnerede data.
Dette er en vigtig sondring at lave, fordi du får forskellige resultater afhængigt af datatypen. Forskellige tegn kan kræve forskellig lagerstørrelse. Et tegn kan bruge 1 byte og et andet kan bruge 2 byte.
Brug af LEFT()
giver dig mulighed for at angive antallet af tegn, uanset hvor mange bytes de bruger.
SET TEXTSIZE
giver dig på den anden side mulighed for at angive antallet af bytes at returnere – ikke taltegnene.
Hvis dataene er gemt ved hjælp af nvarchar(max) for eksempel kan du finde SET TEXTSIZE
returnerer halvdelen af antallet af tegn, der LEFT()
gør.
Eksempel:
CREATE TABLE TextSizeTest ( varchar50 varchar(50), varcharMax varchar(max), nvarcharMax nvarchar(max) ); INSERT INTO TextSizeTestVALUES ( 'Dragonfruit', 'Dragonfruit', 'Dragonfruit' );SET TEXTSIZE 50;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) ASROM varcharMax, LEFT(nvarcharMax; INDSTIL TEKSTSTØRRELSE 4;VÆLG * FRA TextSizeTest;
Resultat:
+-------------+--------------+--------------+| varchar50 | varcharMax | nvarcharMax ||-------------+----------------------------|| Træk | Træk | Træk |+-------------+--------------+--------------+(1 række berørt)Kommandoer gennemført.+-------------------------------------- --+| varchar50 | varcharMax | nvarcharMax ||-------------+----------------------------|| Dragonfruit | Træk | Dr |+---------------------------+---------------+(1 række påvirket)
Det første resultat er for LEFT()
. Det fungerer på tværs af alle tre datatyper og -størrelser. Det returnerer det nøjagtige antal angivne tegn.
Det andet resultat er for SET TEXTSIZE
. Det påvirker ikke varchar(50) resultater. Det påvirker kun de to andre. Men det påvirker dem forskelligt. For varchar(max) , bruger hvert tegn 1 byte, og så får vi det samme antal tegn returneret som den angivne TEXTSIZE
. For nvarchar(max) det er en anden historie. Hvert tegn bruger 2 bytes, og derfor får vi kun halvdelen af antallet af tegn retur.
Resultaterne returneret af LEFT()
kan stadig potentielt blive påvirket af SET TEXTSIZE
. Hvis jeg kører LEFT()
forespørg igen, men før den med SET TEXTSIZE 2
, får vi dette:
SET TEXTSIZE 2;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest;
Resultat:
+-------------+--------------+--------------+| varchar50 | varcharMax | nvarcharMax ||-------------+----------------------------|| Træk | Dr | D |+-------------+--------------+--------------+Maks. datastørrelse vs. fast datastørrelse
En anden forskel er, at
SET TEXTSIZE
virker kun på varchar(max) , nvarchar(max) , varbinary(max) , tekst , ntekst og billede data. Bemærkmax
en del. Hvis du bruger en fast datastørrelse (såsomvarchar(255)
for eksempel),SET TEXTSIZE
virker ikke.
LEFT()
på den anden side fungerer det med alle tegndata undtagen tekst og ntekst .Du kan se disse forskelle i det foregående eksempel. varchar(50) data blev påvirket af
LEFT()
men ikkeSET TEXTSIZE
.LEFT() er mere specifik
En anden forskel er, at
LEFT()
anvendes kun på den kolonne (eller konstant eller variabel), du angiver. Hvis du vil anvende det på flere kolonner/udtryk, skal du inkludere det igen for hvert udtryk. Det samme med efterfølgende forespørgsler.
SET TEXTSIZE
på den anden side anvendes på alle relevante kolonner, der returneres i forespørgslen. Den anvendes også på alle forespørgsler, indtil den er indstillet til en anden værdi.