sql >> Database teknologi >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE i SQL Server:Hvad er forskellen?

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ærk max en del. Hvis du bruger en fast datastørrelse (såsom varchar(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 ikke SET 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.


  1. FLOSS UK forårskonference

  2. Spring Data JPA Auditing fungerer ikke for JpaRepository-opdateringsmetoden med @Modifying annotation, hvorfor?

  3. SQL datakontrolsprog

  4. Sagen om kardinalitetsvurderingen Red Sild