SUBSTRING (Transact-SQL)

Devuelve parte de una expresión de caracteres, binaria, de texto o de imagen. Para obtener más información acerca de los tipos de datos válidos de SQL Server 2005 que se pueden utilizar con esta función, vea Tipos de datos (Transact-SQL).

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

SUBSTRING ( expression ,start , length )

Argumentos

expression

Es una cadena de caracteres, una cadena binaria, texto, imagen, una columna o una expresión que incluye una columna. No utilice expresiones que incluyan funciones de agregado.

start

Es un entero que especifica dónde comienza la subcadena. start puede ser de tipo bigint.

length

Es un entero positivo que especifica cuántos caracteres o bytes de la expression se van a devolver. Si lengthes negativo, se devuelve un error. lengthpuede ser de tipo bigint.

[!NOTA] Debido a que start y length especifican el número de bytes, cuando se utiliza SUBSTRING con datos de tipo text con intercalación DBCS, como Kanji, pueden causar una división de caracteres al comienzo o al final del resultado. Este comportamiento es coherente con la forma en que READTEXT controla DBCS. Por lo tanto, se recomienda utilizar ntext en lugar de text con los caracteres DBCS. Otra alternativa recomendable es utilizar el tipo de datos varchar(max), ya que no divide los caracteres en las intercalaciones DBCS.

Tipos de valor devueltos

Devuelve datos de caracteres si expression es de alguno de los tipos de datos de caracteres admitidos. Devuelve datos binarios si expression es de alguno de los tipos de datos binary admitidos.

La cadena devuelta es del mismo tipo que la expresión indicada, con las excepciones mostradas en la tabla:

Expresión especificada Valor devuelto

char/varchar/text

varchar

nchar/nvarchar/ntext

nvarchar

binary/varbinary/image

varbinary

Notas

Los desplazamientos (start y length) que utilizan los tipos de datos ntext, char o varchar deben especificarse en número de caracteres. Los desplazamientos que utilizan los tipos de datos text, image, binary o varbinary deben especificarse en número de bytes.

[!NOTA] Los niveles de compatibilidad pueden afectar a los valores devueltos. Para obtener más información acerca de los niveles de compatibilidad, vea sp_dbcmptlevel (Transact-SQL).

Ejemplos

A. Utilizar SUBSTRING con una cadena de caracteres

En el siguiente ejemplo se muestra cómo devolver únicamente una parte de una cadena de caracteres. En la tabla Contact, esta consulta devuelve el apellido en una columna y sólo la primera inicial en la segunda columna.

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

Éste es el conjunto de resultados. 

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

(2 row(s) affected)

He aquí cómo mostrar el segundo, tercer y cuarto caracteres de la constante de cadena abcdef.

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

Éste es el conjunto de resultados. 

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

(1 row(s) affected)

B. Utilizar SUBSTRING con datos de tipo text, ntext e image

[!NOTA] Para ejecutar los siguientes ejemplos, es necesario instalar la base de datos pubs. Para obtener información sobre cómo instalar la base de datos pubs, vea Descargar las bases de datos de ejemplo Northwind y pubs.

En el siguiente ejemplo se muestra cómo devolver los primeros 200 caracteres de cada columna con datos de tipo text e image de la tabla pub_info de la base de datos pubs. Los datos de tipo text se devuelven como varchar y los de tipo image como 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'

Éste es el conjunto de resultados. 

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

(1 row(s) affected)

En el ejemplo siguiente se muestra el efecto de SUBSTRING en los datos de tipo text y ntext. En primer lugar, este ejemplo crea una nueva tabla en la base de datos pubs denominada npub_info. En segundo lugar, crea la columna pr_info en la tabla npub_info a partir de los primeros 80 caracteres de la columna pub_info.pr_info y agrega una ü como primer carácter. Por último, una INNER JOIN recupera todos los números de identificación del publicador y una SUBSTRING con las columnas de tipo text y ntext con la información del publicador.

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

Vea también

Referencia

Funciones de cadena (Transact-SQL)

Ayuda e información

Obtener ayuda sobre SQL Server 2005