SUBSTRING (Transact-SQL)

Restituisce parte di un'espressione di tipo carattere, binario, testo o immagine. Per ulteriori informazioni sui tipi di dati di SQL Server 2005 che è possibile utilizzare con questa funzione, vedere Tipi di dati (Transact-SQL).

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

SUBSTRING ( expression ,start , length )

Argomenti

expression

Stringa di tipo carattere, binario, testo, immagine o colonna o espressione che include una colonna. Non sono consentite espressioni che includono funzioni di aggregazione.

start

Valore integer che specifica il punto iniziale della sottostringa. start può essere di tipo bigint.

length

Valore integer positivo che specifica quanti caratteri o byte dell'espressione specificata per expression verranno restituiti Se lengthè negativo, viene restituito un errore. lengthpuò essere di tipo bigint.

[!NOTA] Dal momento che start e length specificano il numero di byte, se si utilizza SUBSTRING nel tipo di dati text con regole di confronto DBCS, ad esempio kanji, può verificarsi una suddivisione dei caratteri all'inizio o alla fine del risultato. Questo comportamento è coerente con il modo in cui READTEXT gestisce DBCS. È consigliabile, pertanto, utilizzare ntext anziché text per i caratteri DBCS. Un'altra alternativa consigliabile consiste nell'utilizzare il tipo di dati varchar(max), perché non divide i caratteri per le regole di confronto DBCS.

Tipi restituiti

Restituisce dati di tipo carattere se expression è uno dei tipi di dati carattere supportati. Restituisce dati di tipo binario se expression è uno dei tipi di dati binary supportati.

Il tipo di dati della stringa restituita corrisponde a quello dell'espressione specificata, con le eccezioni descritte nella tabella seguente.

Espressione specificata Tipo restituito

char/varchar/text

varchar

nchar/nvarchar/ntext

nvarchar

binary/varbinary/image

varbinary

Osservazioni

Per gli offset (start e length) che utilizzano i tipi di dati ntext, char o varchar è necessario specificare il numero di caratteri. Per gli offset che utilizzano i tipi di dati text, image, binary o varbinary è necessario specificare il numero di byte.

[!NOTA] I livelli di compatibilità possono influire sui valori restituiti. Per ulteriori informazioni sui livelli di compatibilità, vedere sp_dbcmptlevel (Transact-SQL).

Esempi

A. Utilizzo della funzione SUBSTRING con una stringa di caratteri

In questo esempio viene illustrato come restituire solo una parte di una stringa di caratteri. Questa query eseguita nella tabella Contact restituisce il cognome in una colonna e l'iniziale del nome nella seconda colonna.

USE AdventureWorks;
GO
SELECT LastName, SUBSTRING(FirstName, 1, 1) AS Initial
FROM Person.Contact
WHERE LastName like 'Barl%'
ORDER BY LastName

Set di risultati: 

LastName   Initial
---------------------------------        -------
Barley     R
Barlow     B

(2 row(s) affected)

Di seguito viene illustrato come visualizzare il secondo, il terzo e il quarto carattere della costante stringa abcdef.

SELECT x = SUBSTRING('abcdef', 2, 3)

Set di risultati: 

x
----------
bcd

(1 row(s) affected)

B. Utilizzo della funzione SUBSTRING con dati di tipo text, ntext e image

[!NOTA] Per eseguire gli esempi seguenti, è necessario installare il database pubs. Per informazioni sulle procedure di installazione del database pubs, vedere Download dei database di esempio Northwind e pubs.

Nell'esempio seguente viene illustrato come restituire i primi 200 caratteri di ogni colonna di dati text e image nella tabella pub_info del database pubs. I dati di tipo text vengono restituiti come varchar e i dati di tipo image vengono restituiti come varbinary.

USE pubs
SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo, 
   SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = '1756'

Set di risultati: 

pub_id logo    pr_info    
------ ---------------------- ---------- 
1756   0x474946383961E3002500 This is sa

(1 row(s) affected)

Nell'esempio seguente vengono illustrati gli effetti della funzione SUBSTRING sui dati di tipo text e ntext. In primo luogo nel database pubs viene creata una nuova tabella denominata npub_info. In secondo luogo viene creata la colonna pr_info nella tabella npub_info dai primi 80 caratteri della colonna pub_info.pr_info e come primo carattere viene aggiunto ü. Infine, tramite un INNER JOIN vengono recuperati i numeri di identificazione di tutti i server di pubblicazione e il valore di SUBSTRING di entrambe le colonne di tipo text e ntext contenenti informazioni sui server di pubblicazione.

IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES 
      WHERE table_name = 'npub_info')
   DROP TABLE npub_info
GO
-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
USE pubs
GO
CREATE TABLE npub_info
(
 pub_id         char(4)           NOT NULL
         REFERENCES publishers(pub_id)
         CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
 pr_info        ntext             NULL
)

GO

-- Fill the pr_info column in npub_info with international data.
RAISERROR('Now at the inserts to pub_info...',0,1)

GO

INSERT npub_info VALUES('0736', N'üThis is sample text data for New Moon Books, publisher 0736 in the pubs database')
INSERT npub_info values('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa')
INSERT npub_info values('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da')
INSERT npub_info values('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database')
INSERT npub_info values('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d')
INSERT npub_info values('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab')
INSERT npub_info values('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i')
INSERT npub_info values('9999', N'üThis is sample text data for Lucerne Publishing, publisher 9999 in the pubs data')
GO
-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
   SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info pr INNER JOIN npub_info npr
   ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC

Vedere anche

Riferimento

Funzioni per i valori stringa (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005