STRING_SPLIT (Transact-SQL)STRING_SPLIT (Transact-SQL)

SE APLICA A: síSQL Server 2016 y versiones posteriores síAzure SQL Database síAzure Synapse Analytics (SQL DW) noAlmacenamiento de datos paralelos APPLIES TO: YesSQL Server 2016 and later YesAzure SQL Database YesAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Una función con valores de tabla que divide una cadena en filas de subcadenas, según un carácter separador especificado.A table-valued function that splits a string into rows of substrings, based on a specified separator character.

Nivel de compatibilidad 130Compatibility level 130

STRING_SPLIT requiere que el nivel de compatibilidad sea al menos 130.STRING_SPLIT requires the compatibility level to be at least 130. Cuando el nivel es inferior a 130, SQL Server no puede encontrar la función STRING_SPLIT.When the level is less than 130, SQL Server is unable to find the STRING_SPLIT function.

Para cambiar el nivel de compatibilidad de una base de datos, vea Ver o cambiar el nivel de compatibilidad de una base de datos.To change the compatibility level of a database, refer to View or Change the Compatibility Level of a Database.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

STRING_SPLIT ( string , separator )  

Nota

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

ArgumentosArguments

stringstring
Es una expresión de cualquier tipo de carácter (por ejemplo nvarchar, varchar, nchar o char).Is an expression of any character type (for example, nvarchar, varchar, nchar, or char).

separatorseparator
Es una expresión de carácter único de cualquier tipo de caracteres (por ejemplo, nvarchar(1) , varchar(1) , nchar(1) o char(1) ) que se usa como separador para subcadenas concatenadas.Is a single character expression of any character type (for example, nvarchar(1), varchar(1), nchar(1), or char(1)) that is used as separator for concatenated substrings.

Tipos de valor devueltoReturn Types

Devuelve una tabla de una sola columna cuyas filas son las subcadenas.Returns a single-column table whose rows are the substrings. El nombre de la columna es value.The name of the column is value. Devuelve nvarchar si cualquiera de los argumentos de entrada es nvarchar o nchar.Returns nvarchar if any of the input arguments are either nvarchar or nchar. De lo contrario, devuelve varchar.Otherwise returns varchar. La longitud del tipo de valor devuelto es igual a la longitud del argumento de cadena.The length of the return type is the same as the length of the string argument.

ObservacionesRemarks

STRING_SPLIT introduce una cadena que tiene subcadenas delimitadas y un carácter que se usará como el delimitador o el separador.STRING_SPLIT inputs a string that has delimited substrings, and inputs one character to use as the delimiter or separator. STRING_SPLIT da como resultado una tabla de una sola columna cuyas filas contienen las subcadenas.STRING_SPLIT outputs a single-column table whose rows contain the substrings. El nombre de la columna de resultados es value.The name of the output column is value.

Las filas de salida pueden estar en cualquier orden.The output rows might be in any order. No se garantiza que el orden coincida con el de las subcadenas de la cadena de entrada.The order is not guaranteed to match the order of the substrings in the input string. Puede invalidar el orden final usando una cláusula ORDER BY en la instrucción SELECT (ORDER BY value).You can override the final sort order by using an ORDER BY clause on the SELECT statement (ORDER BY value).

0x0000 (char(0) ) es un carácter no definido en las intercalaciones de Windows y no se puede incluir en STRING_SPLIT.0x0000 (char(0)) is an undefined character in Windows collations and cannot be included in STRING_SPLIT.

Las subcadenas vacías de longitud cero están presentes cuando la cadena de entrada contiene dos o más repeticiones consecutivas del carácter delimitador.Empty zero-length substrings are present when the input string contains two or more consecutive occurrences of the delimiter character. Las subcadenas vacías se tratan de la misma forma que las subcadenas sin formato.Empty substrings are treated the same as are plain substrings. Puede filtrar las filas que contienen la subcadena vacía usando la cláusula WHERE (WHERE value <> '').You can filter out any rows that contain the empty substring by using the WHERE clause (WHERE value <> ''). Si la cadena de entrada es NULL, la función con valores de tabla STRING_SPLIT devuelve una tabla vacía.If the input string is NULL, the STRING_SPLIT table-valued function returns an empty table.

Por ejemplo, la siguiente instrucción SELECT utiliza el carácter de espacio como el separador:As an example, the following SELECT statement uses the space character as the separator:

SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');

En una ejecución práctica, la instrucción SELECT anterior devolvió la siguiente tabla de resultados:In a practice run, the preceding SELECT returned following result table:

valuevalue
LoremLorem
ipsumipsum
dolordolor
sitsit
amet.amet.
 

EjemplosExamples

A.A. Dividir una cadena de valores separados por comaSplit comma-separated value string

Se analiza una lista de valores separados por coma y se devuelven todos los tokens que no están vacíos:Parse a comma-separated list of values and return all non-empty tokens:

DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'  
  
SELECT value  
FROM STRING_SPLIT(@tags, ',')  
WHERE RTRIM(value) <> '';

STRING_SPLIT devolverá una cadena vacía si no hay nada entre el separador.STRING_SPLIT will return empty string if there is nothing between separator. La condición "RTRIM(value) <>" quitará los tokens vacíos.Condition RTRIM(value) <> '' will remove empty tokens.

B.B. Dividir una cadena de valores separados por coma en una columnaSplit comma-separated value string in a column

La tabla Product tiene una columna con una lista de etiquetas separadas por comas que se muestran en el siguiente ejemplo:Product table has a column with comma-separate list of tags shown in the following example:

ProductIdProductId NombreName EtiquetasTags
11 GuantesFull-Finger Gloves clothing,road,touring,bikeclothing,road,touring,bike
22 Auriculares LLLL Headset bikebike
33 HL Mountain FrameHL Mountain Frame bike,mountainbike,mountain

Con la siguiente consulta se transforma cada lista de etiquetas y las combina con la fila original:Following query transforms each list of tags and joins them with the original row:

SELECT ProductId, Name, value  
FROM Product  
    CROSS APPLY STRING_SPLIT(Tags, ',');  

El conjunto de resultados es el siguiente:Here is the result set.

ProductIdProductId NombreName valuevalue
11 GuantesFull-Finger Gloves clothingclothing
11 GuantesFull-Finger Gloves carreterasroad
11 GuantesFull-Finger Gloves touringtouring
11 GuantesFull-Finger Gloves bikebike
22 Auriculares LLLL Headset bikebike
33 HL Mountain FrameHL Mountain Frame bikebike
33 HL Mountain FrameHL Mountain Frame mountainmountain

Nota

El orden de la salida puede variar, ya que no se garantiza que el orden coincida con el de las subcadenas de la cadena de entrada.The order of the output may vary as the order is not guaranteed to match the order of the substrings in the input string.

C.C. Agregación por valoresAggregation by values

Los usuarios deben crear un informe en el que se muestre el número de productos por etiqueta, ordenadas por número de productos, y filtrar solo las etiquetas con más de dos productos.Users must create a report that shows the number of products per each tag, ordered by number of products, and to filter only the tags with more than two products.

SELECT value as tag, COUNT(*) AS [Number of articles]  
FROM Product  
    CROSS APPLY STRING_SPLIT(Tags, ',')  
GROUP BY value  
HAVING COUNT(*) > 2  
ORDER BY COUNT(*) DESC;  

D.D. Buscar por el valor de tablaSearch by tag value

Los desarrolladores deben crear consultas que hallen artículos a partir de palabras clave.Developers must create queries that find articles by keywords. Pueden usar las siguientes consultas:They can use following queries:

Para encontrar productos con una sola etiqueta (clothing):To find products with a single tag (clothing):

SELECT ProductId, Name, Tags  
FROM Product  
WHERE 'clothing' IN (SELECT value FROM STRING_SPLIT(Tags, ','));  

Para encontrar productos con dos etiquetas especificadas (clothing y road):Find products with two specified tags (clothing and road):

SELECT ProductId, Name, Tags  
FROM Product  
WHERE EXISTS (SELECT *  
    FROM STRING_SPLIT(Tags, ',')  
    WHERE value IN ('clothing', 'road'));  

E.E. Encontrar filas por la lista de valoresFind rows by list of values

Los desarrolladores deben crear una consulta que busque los artículos a partir de una lista de identificadores.Developers must create a query that finds articles by a list of IDs. Pueden usar la siguiente consulta:They can use following query:

SELECT ProductId, Name, Tags  
FROM Product  
JOIN STRING_SPLIT('1,2,3',',')
    ON value = ProductId;  

El uso de STRING_SPLIT anterior es un reemplazo para un antipatrón común.The preceding STRING_SPLIT usage is a replacement for a common anti-pattern. Este tipo de antipatrón puede implicar la creación de una cadena SQL dinámica en el nivel de aplicación o en Transact-SQL.Such an anti-pattern can involve the creation of a dynamic SQL string in the application layer or in Transact-SQL. O bien un antipatrón puede lograrse mediante el operador LIKE.Or an anti-pattern can be achieved by using the LIKE operator. Vea la instrucción SELECT de ejemplo siguiente:See the following example SELECT statement:

SELECT ProductId, Name, Tags  
FROM Product  
WHERE ',1,2,3,' LIKE '%,' + CAST(ProductId AS VARCHAR(20)) + ',%';  

Consulte tambiénSee Also