Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE in SQL Server:qual è la differenza?

Potresti avere familiarità con SET TEXTSIZE istruzione in SQL Server, che consente di limitare la quantità di dati restituiti in un SELECT interrogazione.

Forse stai scoprendo che i suoi risultati sono esattamente gli stessi di LEFT() durante l'esecuzione di una query specifica. Il che fa sorgere la domanda:c'è una differenza tra queste due opzioni?

Ci sono sicuramente differenze tra queste due opzioni. Ci sono casi in cui entrambe le funzioni restituiranno risultati completamente diversi. E ci sono anche differenze nel modo in cui funzionano, così come nel tipo di dati su cui possono essere utilizzati.

Definizioni

Iniziamo osservando cosa fa ciascuno.

LEFT()
Restituisce la parte sinistra di una stringa di caratteri con il numero di caratteri specificato.
SET TEXTSIZE
Specifica la dimensione di varchar(max) , nvarchar(max) , variabile(max) , testo , ntesto e immagine dati restituiti da un SELECT dichiarazione.

Esaminiamolo in dettaglio.

Caratteri e dimensioni dei dati

Prestare attenzione alla formulazione di ciascuna definizione. In particolare le parole “caratteri” vs “dimensione” e “dati”.

  • LEFT() ti consente di indicare esplicitamente quanti caratteri vengono restituiti.
  • SET TEXTSIZE consente di specificare la dimensione dei dati restituiti.

Questa è una distinzione importante da fare, perché otterrai risultati diversi a seconda del tipo di dati. Caratteri diversi possono richiedere dimensioni di archiviazione diverse. Un carattere potrebbe utilizzare 1 byte e un altro potrebbe utilizzare 2 byte.

Usando LEFT() ti consentirà di specificare il numero di caratteri, indipendentemente dal numero di byte utilizzati.

SET TEXTSIZE consente invece di specificare il numero di byte restituire – non i caratteri numerici.

Se i dati vengono archiviati utilizzando nvarchar(max) ad esempio, potresti trovare che SET TEXTSIZE restituisce la metà del numero di caratteri che LEFT() fa.

Esempio:

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;

Risultato:

+-------------+--------------+---------------+
| varchar50   | varcharMax   | nvarcharMax   |
|-------------+--------------+---------------|
| Drag        | Drag         | Drag          |
+-------------+--------------+---------------+
(1 row affected)
Commands completed successfully.
+-------------+--------------+---------------+
| varchar50   | varcharMax   | nvarcharMax   |
|-------------+--------------+---------------|
| Dragonfruit | Drag         | Dr            |
+-------------+--------------+---------------+
(1 row affected)

Il primo risultato è per LEFT() . Funziona su tutti e tre i tipi e le dimensioni di dati. Restituisce il numero esatto di caratteri specificato.

Il secondo risultato è per SET TEXTSIZE . Non influisce su varchar(50) risultati. Colpisce solo gli altri due. Ma li colpisce in modo diverso. Per varchar(max) , ogni carattere utilizza 1 byte, quindi otteniamo lo stesso numero di caratteri restituito come TEXTSIZE specificato . Per nvarchar(max) è una storia diversa. Ogni carattere utilizza 2 byte, quindi otteniamo solo la metà del numero di caratteri restituiti.

Tuttavia, i risultati restituiti da LEFT() potrebbe ancora essere potenzialmente influenzato da SET TEXTSIZE . Se eseguo LEFT() interrogare di nuovo, ma precederlo con SET TEXTSIZE 2 , otteniamo questo:

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

Risultato:

+-------------+--------------+---------------+
| varchar50   | varcharMax   | nvarcharMax   |
|-------------+--------------+---------------|
| Drag        | Dr           | D             |
+-------------+--------------+---------------+

Dimensione massima dei dati rispetto alla dimensione fissa dei dati

Un'altra differenza è che SET TEXTSIZE funziona solo su varchar(max) , nvarchar(max) , variabile(max) , testo , ntesto e immagine dati. Nota il max parte. Se utilizzi una dimensione dati fissa (come varchar(255) ad esempio), SET TEXTSIZE non funzionerà.

LEFT() d'altra parte, funziona con tutti i dati dei caratteri tranne testo e ntext .

Puoi vedere queste differenze nell'esempio precedente. Il varchar(50) i dati sono stati interessati da LEFT() ma non SET TEXTSIZE .

LEFT() è più specifico

Un'altra differenza è che LEFT() viene applicato solo alla colonna (o costante o variabile) specificata. Se vuoi applicarlo a più colonne/espressioni, devi includerlo di nuovo per ogni espressione. Lo stesso con le query successive.

SET TEXTSIZE d'altra parte, viene applicato a tutte le colonne applicabili restituite nella query. Viene anche applicato a tutte le query finché non viene impostato su un altro valore.