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
SELECTdichiarazione.
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 TEXTSIZEconsente 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.