sql >> Databasteknik >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE i SQL Server:Vad är skillnaden?

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. Notera max del. Om du använder en fast datastorlek (som varchar(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 inte SET 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.


  1. kan inte skapa tillägg utan superanvändarroll

  2. Vilken är inställningen för att se tidsdelen med datum i Oracle PL/SQL-utvecklare?

  3. Hur släpper man en PostgreSQL-databas om det finns aktiva anslutningar till den?

  4. Konvertera månadsnamn till månadsnummer i SQL Server