Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE dans SQL Server :quelle est la différence ?

Vous connaissez peut-être le SET TEXTSIZE instruction dans SQL Server, qui vous permet de limiter la quantité de données renvoyées dans un SELECT requête.

Peut-être trouvez-vous que ses résultats sont exactement les mêmes que LEFT() lors de l'exécution d'une requête spécifique. Ce qui soulève la question :y a-t-il une différence entre ces deux options ?

Il y a certainement des différences entre ces deux options. Il y a des cas où les deux fonctions renverront des résultats complètement différents. Et il existe également des différences dans leur fonctionnement, ainsi que dans le type de données sur lesquelles ils peuvent être utilisés.

Définitions

Commençons par regarder ce que chacun fait.

LEFT()
Renvoie la partie gauche d'une chaîne de caractères avec le nombre de caractères spécifié.
SET TEXTSIZE
Spécifie la taille de varchar(max) , nvarchar(max) , varbinaire(max) , texte , texte , et image données renvoyées par un SELECT déclaration.

Examinons cela en détail.

Caractères vs taille des données

Faites attention au libellé de chaque définition. En particulier, les mots "caractères" vs "taille" et "données".

  • LEFT() vous permet d'indiquer explicitement le nombre de caractères sont retournés.
  • SET TEXTSIZE vous permet de spécifier la taille des données renvoyées.

Il s'agit d'une distinction importante à faire, car vous obtiendrez des résultats différents selon le type de données. Différents caractères peuvent nécessiter une taille de stockage différente. Un caractère peut utiliser 1 octet et un autre peut utiliser 2 octets.

Utilisation de LEFT() vous permettra de spécifier le nombre de caractères, quel que soit le nombre d'octets qu'ils utilisent.

SET TEXTSIZE d'autre part, permet de spécifier le nombre d'octets revenir - pas les caractères numériques.

Si les données sont stockées à l'aide de nvarchar(max) par exemple, vous pourriez trouver que SET TEXTSIZE renvoie la moitié du nombre de caractères que LEFT() Est-ce que.

Exemple :

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(nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest; SET TEXTSIZE 4;SELECT * FROM TextSizeTest;

Résultat :

+-------------+-------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+-------------+---------------|| Faites glisser | Faites glisser | Glisser |+-------------+-------------+---------------+(1 ligne affectée)Commandes terminées avec succès.+-------------+--------------+------------- --+| varchar50 | varcharMax | nvarcharMax ||-------------+-------------+---------------|| Fruit du dragon | Faites glisser | Dr |+-------------+-------------+---------------+(1 ligne affectée)

Le premier résultat est pour LEFT() . Il fonctionne sur les trois types et tailles de données. Il renvoie le nombre exact de caractères spécifiés.

Le deuxième résultat est pour SET TEXTSIZE . Cela n'affecte pas le varchar(50) résultats. Cela n'affecte que les deux autres. Mais cela les affecte différemment. Pour varchar(max) , chaque caractère utilise 1 octet, et nous obtenons donc le même nombre de caractères renvoyés que le TEXTSIZE spécifié . Pour nvarchar(max) c'est une autre histoire. Chaque caractère utilise 2 octets, et nous n'obtenons donc que la moitié du nombre de caractères renvoyés.

Cependant, les résultats renvoyés par LEFT() pourrait toujours être affecté par SET TEXTSIZE . Si j'exécute le LEFT() requête à nouveau, mais faites-la précéder de SET TEXTSIZE 2 , nous obtenons ceci :

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

Résultat :

+-------------+-------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+-------------+---------------|| Faites glisser | Docteur | D |+-------------+-------------+---------------+ 

Taille maximale des données par rapport à la taille fixe des données

Une autre différence est que SET TEXTSIZE ne fonctionne que sur varchar(max) , nvarchar(max) , varbinaire(max) , texte , texte , et image Les données. Notez le max partie. Si vous utilisez une taille de données fixe (telle que varchar(255) par exemple), SET TEXTSIZE ne fonctionnera pas.

LEFT() d'autre part, fonctionne avec toutes les données de caractères sauf sauf texte et texte .

Vous pouvez voir ces différences dans l'exemple précédent. Le varchar(50) les données ont été affectées par LEFT() mais pas SET TEXTSIZE .

LEFT() est plus spécifique

Une autre différence est que LEFT() s'applique uniquement à la colonne (ou à la constante ou à la variable) que vous spécifiez. Si vous souhaitez l'appliquer à plusieurs colonnes/expressions, vous devez l'inclure à nouveau pour chaque expression. Idem pour les requêtes suivantes.

SET TEXTSIZE d'autre part, est appliqué à toutes les colonnes applicables renvoyées dans la requête. Il est également appliqué à toutes les requêtes jusqu'à ce qu'il soit défini sur une autre valeur.