sql >> Databáze >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE v SQL Server:Jaký je rozdíl?

Možná znáte SET TEXTSIZE příkazu SQL Server, který umožňuje omezit množství dat vrácených v SELECT dotaz.

Možná zjišťujete, že jeho výsledky jsou úplně stejné jako LEFT() při spuštění konkrétního dotazu. Což vyvolává otázku:Je mezi těmito dvěma možnostmi rozdíl?

Mezi těmito dvěma možnostmi jsou určitě rozdíly. Existují případy, kdy obě funkce vrátí zcela odlišné výsledky. Rozdíly jsou také v tom, jak fungují, a také v typu dat, se kterými je lze použít.

Definice

Začněme tím, že se podíváme na to, co každý dělá.

LEFT()
Vrátí levou část řetězce znaků se zadaným počtem znaků.
SET TEXTSIZE
Určuje velikost varchar(max) , nvarchar(max) , varbinary(max) , text , ntext a obrázek data vrácená SELECT prohlášení.

Podívejme se na to podrobně.

Znaky vs velikost dat

Věnujte pozornost znění každé definice. Zejména slova „znaky“ vs. „velikost“ a „údaje“.

  • LEFT() umožňuje explicitně uvést počet znaků jsou vráceny.
  • SET TEXTSIZE umožňuje zadat velikost vrácených dat.

Toto je důležitý rozdíl, protože v závislosti na typu dat získáte různé výsledky. Různé znaky mohou vyžadovat různou velikost úložiště. Jeden znak může používat 1 bajt a jiný 2 bajty.

Pomocí LEFT() vám umožní určit počet znaků bez ohledu na to, kolik bajtů používají.

SET TEXTSIZE na druhé straně umožňuje zadat počet bajtů vrátit se – ne číselné znaky.

Pokud jsou data uložena pomocí nvarchar(max) můžete například zjistit, že SET TEXTSIZE vrátí polovinu počtu znaků, které LEFT() dělá.

Příklad:

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) AS varcharMax, LEFT(nvarizeMaxTcharest ROM, Text4 SET TEXTSIZE 4;SELECT * FROM TextSizeTest;

Výsledek:

+-------------+--------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+--------------+--------------|| Přetáhnout | Přetáhnout | Přetáhnout |+-------------+--------------+---------------+(1 ovlivněný řádek)Příkazy úspěšně dokončeny.+-------------+--------------+------------- --+| varchar50 | varcharMax | nvarcharMax ||-------------+--------------+--------------|| Dragonfruit | Přetáhnout | Dr |+-------------+--------------+---------------+(1 dotčený řádek)

První výsledek je pro LEFT() . Funguje napříč všemi třemi datovými typy a velikostmi. Vrátí přesný počet zadaných znaků.

Druhý výsledek je pro SET TEXTSIZE . Nemá vliv na varchar(50) Výsledek. Ovlivňuje pouze další dva. Působí na ně ale jinak. Pro varchar(max) , každý znak používá 1 bajt, takže dostaneme stejný počet znaků jako zadaný TEXTSIZE . Pro nvarchar(max) to je jiný příběh. Každý znak používá 2 bajty, takže dostaneme pouze poloviční počet vrácených znaků.

Výsledky však vrátila funkce LEFT() může být stále potenciálně ovlivněna SET TEXTSIZE . Pokud spustím LEFT() dotaz znovu, ale před ním uveďte SET TEXTSIZE 2 , dostaneme toto:

SET TEXTSIZE 2;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest;

Výsledek:

+-------------+--------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+--------------+--------------|| Přetáhnout | Dr | D |+-------------+--------------+---------------+ 

Max. velikost dat vs. pevná velikost dat

Dalším rozdílem je, že SET TEXTSIZE funguje pouze na varchar(max) , nvarchar(max) , varbinary(max) , text , ntext a obrázek data. Všimněte si max část. Pokud používáte pevnou velikost dat (například varchar(255) například), SET TEXTSIZE nebude fungovat.

LEFT() na druhou stranu pracuje se všemi znakovými daty kromě textu a ntext .

Tyto rozdíly můžete vidět v předchozím příkladu. varchar(50) data byla ovlivněna LEFT() ale ne SET TEXTSIZE .

LEFT() je konkrétnější

Dalším rozdílem je, že LEFT() se použije pouze na sloupec (nebo konstantu nebo proměnnou), který určíte. Pokud jej chcete použít na více sloupců/výrazů, musíte jej znovu zahrnout pro každý výraz. Totéž s následnými dotazy.

SET TEXTSIZE na druhé straně se použije na všechny použitelné sloupce vrácené v dotazu. Použije se také na všechny dotazy, dokud není nastavena na jinou hodnotu.


  1. Instalace Microsoft SQL Server 2012 Enterprise Edition s aktualizací Service Pack 1

  2. oracle diff:jak porovnat dvě tabulky?

  3. Obchodní logika:Databázová nebo aplikační vrstva

  4. Vytvoření tabulky v režimu jednoho uživatele v postgresu