Je bent misschien bekend met de SET TEXTSIZE
statement in SQL Server, waarmee u de hoeveelheid gegevens kunt beperken die wordt geretourneerd in een SELECT
vraag.
Misschien merk je dat de resultaten precies hetzelfde zijn als LEFT()
bij het uitvoeren van een specifieke query. Wat de vraag oproept:is er een verschil tussen deze twee opties?
Er zijn zeker verschillen tussen deze twee opties. Er zijn gevallen waarin beide functies totaal verschillende resultaten opleveren. En er zijn ook verschillen in hoe ze werken, evenals het type gegevens waarop ze kunnen worden gebruikt.
Definities
Laten we beginnen met te kijken naar wat iedereen doet.
LEFT()
- Retourneert het linkergedeelte van een tekenreeks met het opgegeven aantal tekens.
SET TEXTSIZE
- Specificeert de grootte van varchar(max) , nvarchar(max) , varbinary(max) , tekst , ntekst , en afbeelding gegevens geretourneerd door een
SELECT
verklaring.
Laten we dit in detail bekijken.
Tekens versus gegevensgrootte
Besteed aandacht aan de formulering van elke definitie. In het bijzonder de woorden "tekens" versus "grootte" en "gegevens".
LEFT()
stelt u in staat om expliciet aan te geven hoeveel tekens worden geretourneerd.SET TEXTSIZE
stelt u in staat om de maat . te specificeren van de geretourneerde gegevens.
Dit is een belangrijk onderscheid om te maken, omdat u verschillende resultaten krijgt, afhankelijk van het gegevenstype. Verschillende karakters kunnen verschillende opslaggroottes vereisen. Eén teken kan 1 byte gebruiken en een ander kan 2 bytes gebruiken.
Gebruik LEFT()
stelt u in staat om het aantal tekens te specificeren, ongeacht het aantal bytes dat ze gebruiken.
SET TEXTSIZE
aan de andere kant kunt u het aantal bytes . specificeren om terug te keren - niet de cijfertekens.
Als de gegevens zijn opgeslagen met nvarchar(max) u zou bijvoorbeeld kunnen vinden dat SET TEXTSIZE
geeft de helft van het aantal tekens terug dat LEFT()
doet.
Voorbeeld:
CREATE TABLE TextSizeTest ( varchar50 varchar(50), varcharMax varchar(max), nvarcharMax nvarchar(max) ); INSERT INTO TextSizeTest VALUES ( 'Dragonfruit', 'Dragonfruit', 'Dragonfruit' ); SET TEXTSIZE 50; SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMax FROM TextSizeTest; SET TEXTSIZE 4; SELECT * FROM TextSizeTest;
Resultaat:
+-------------+--------------+---------------+ | varchar50 | varcharMax | nvarcharMax | |-------------+--------------+---------------| | Drag | Drag | Drag | +-------------+--------------+---------------+ (1 row affected) Commands completed successfully. +-------------+--------------+---------------+ | varchar50 | varcharMax | nvarcharMax | |-------------+--------------+---------------| | Dragonfruit | Drag | Dr | +-------------+--------------+---------------+ (1 row affected)
Het eerste resultaat is voor LEFT()
. Het werkt voor alle drie de gegevenstypen en -groottes. Het geeft het exacte aantal opgegeven tekens terug.
Het tweede resultaat is voor SET TEXTSIZE
. Het heeft geen invloed op de varchar(50) resultaten. Het heeft alleen invloed op de andere twee. Maar het beïnvloedt hen anders. Voor varchar(max) , elk teken gebruikt 1 byte, en dus krijgen we hetzelfde aantal tekens geretourneerd als de opgegeven TEXTSIZE
. Voor nvarchar(max) het is een ander verhaal. Elk teken gebruikt 2 bytes, en dus krijgen we maar de helft van het aantal tekens terug.
De resultaten die worden geretourneerd door LEFT()
kan nog steeds mogelijk worden beïnvloed door SET TEXTSIZE
. Als ik de LEFT()
vraag opnieuw, maar laat het voorafgaan met SET TEXTSIZE 2
, krijgen we dit:
SET TEXTSIZE 2; SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMax FROM TextSizeTest;
Resultaat:
+-------------+--------------+---------------+ | varchar50 | varcharMax | nvarcharMax | |-------------+--------------+---------------| | Drag | Dr | D | +-------------+--------------+---------------+
Maximale gegevensgrootte versus vaste gegevensgrootte
Een ander verschil is dat SET TEXTSIZE
werkt alleen op varchar(max) , nvarchar(max) , varbinary(max) , tekst , ntekst , en afbeelding gegevens. Let op de max
deel. Als u een vaste gegevensgrootte gebruikt (zoals varchar(255)
bijvoorbeeld), SET TEXTSIZE
werkt niet.
LEFT()
aan de andere kant, werkt met alle karaktergegevens behalve tekst en ntext .
U kunt deze verschillen zien in het vorige voorbeeld. De varchar(50) gegevens werden beïnvloed door LEFT()
maar niet SET TEXTSIZE
.
LEFT() is specifieker
Een ander verschil is dat LEFT()
wordt alleen toegepast op de kolom (of constante of variabele) die u opgeeft. Als u het op meerdere kolommen/uitdrukkingen wilt toepassen, moet u het voor elke uitdrukking opnieuw opnemen. Hetzelfde met volgende vragen.
SET TEXTSIZE
aan de andere kant, wordt toegepast op alle toepasselijke kolommen die in de query worden geretourneerd. Het wordt ook toegepast op alle query's totdat het is ingesteld op een andere waarde.