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.