sql >> Database >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE in SQL Server:wat is het verschil?

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.


  1. SQLite Like()-functie met voorbeelden

  2. Selectie verlenen voor alle tabellen die eigendom zijn van een specifieke gebruiker

  3. INSERT INTO gebruiken vanuit SQL Server om Salesforce-gegevens te wijzigen

  4. Kan ik een externe sleutel hebben die verwijst naar een kolom in een weergave in SQL Server?