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).
Convenciones 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)