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

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse noParallel Data Warehouse

Uma função com valor de tabela que divide uma cadeia de caracteres em linhas de subcadeias de caracteres com base em um caractere separador especificado.A table-valued function that splits a string into rows of substrings, based on a specified separator character.

Nível de compatibilidade 130Compatibility level 130

STRING_SPLIT requer que o nível de compatibilidade seja, no mínimo, 130.STRING_SPLIT requires the compatibility level to be at least 130. Quando o nível for inferior a 130, o SQL Server não conseguirá localizar a função STRING_SPLIT.When the level is less than 130, SQL Server is unable to find the STRING_SPLIT function.

Para alterar o nível de compatibilidade de um banco de dados, consulte Exibir ou alterar o nível de compatibilidade de um banco de dados.To change the compatibility level of a database, refer to View or Change the Compatibility Level of a Database.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

STRING_SPLIT ( string , separator )  

ArgumentosArguments

cadeia de caracteresstring
É uma expression de qualquer tipo de caractere (ou seja, nvarchar, varchar, nchar ou char).Is an expression of any character type (for example, nvarchar, varchar, nchar, or char).

separatorseparator
É uma expressão de caractere único de qualquer tipo de caractere (por exemplo, nvarchar(1) , varchar(1) , nchar(1) ou char(1) ) usada como separador de subcadeias de caracteres 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 retornoReturn Types

Retorna uma tabela de coluna única cujas linhas são as subcadeias de caracteres.Returns a single-column table whose rows are the substrings. O nome da coluna é value.The name of the column is value. Retorna nvarchar se um dos argumentos de entrada são nvarchar ou nchar.Returns nvarchar if any of the input arguments are either nvarchar or nchar. Caso contrário, retorna varchar.Otherwise returns varchar. O tamanho do tipo de retorno é o mesmo que o tamanho do argumento da cadeia de caracteres.The length of the return type is the same as the length of the string argument.

RemarksRemarks

STRING_SPLIT insere uma cadeia de caracteres que tem subcadeias de caracteres delimitadas e insere um caractere a ser usado como separador ou delimitador.STRING_SPLIT inputs a string that has delimited substrings, and inputs one character to use as the delimiter or separator. STRING_SPLIT gera uma tabela de coluna única cujas linhas contêm as subcadeias de caracteres.STRING_SPLIT outputs a single-column table whose rows contain the substrings. O nome da coluna de saída é value.The name of the output column is value.

As linhas de saída podem estar em outra ordem.The output rows might be in any order. A ordem não é a garantia de corresponder à ordem das subcadeias de caracteres na cadeia de caracteres de entrada.The order is not guaranteed to match the order of the substrings in the input string. É possível substituir a ordem de classificação final usando uma cláusula ORDER BY na instrução SELECT (ORDER BY value).You can override the final sort order by using an ORDER BY clause on the SELECT statement (ORDER BY value).

Subcadeias de caracteres de comprimento zero vazias estão presentes quando a cadeia de caracteres de entrada contém duas ou mais ocorrências consecutivas do caractere delimitador.Empty zero-length substrings are present when the input string contains two or more consecutive occurrences of the delimiter character. As subcadeias de caracteres vazias são tratadas da mesma forma que são as subcadeias de caracteres sem formatação.Empty substrings are treated the same as are plain substrings. É possível filtrar as linhas que contêm a subcadeia de caracteres vazia usando a cláusula WHERE (WHERE value <> '').You can filter out any rows that contain the empty substring by using the WHERE clause (WHERE value <> ''). Se a cadeia de caracteres de entrada for NULL, a função com valor de tabela STRING_SPLIT retornará uma tabela vazia.If the input string is NULL, the STRING_SPLIT table-valued function returns an empty table.

Por exemplo, a seguinte instrução SELECT usa o caractere de espaço como o 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.', ' ');

Na prática, a SELECT anterior retornava a seguinte tabela de resultado:In a practice run, the preceding SELECT returned following result table:

valuevalue
LoremLorem
ipsumipsum
dolordolor
sitsit
amet.amet.
 

ExemplosExamples

A.A. Dividir uma cadeia de caracteres de valores separados por vírgulaSplit comma-separated value string

Analise uma lista separada por vírgulas de valores e retorne todos os tokens não vazios: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 retornará a cadeia de caracteres vazia se não houver nada entre o separador.STRING_SPLIT will return empty string if there is nothing between separator. A condição RTRIM(value) <> '' removerá tokens vazios.Condition RTRIM(value) <> '' will remove empty tokens.

B.B. Dividir uma cadeia de caracteres de valores separados por vírgula em uma colunaSplit comma-separated value string in a column

A tabela Product tem uma coluna com uma lista separada por vírgula de marcas mostradas no seguinte exemplo:Product table has a column with comma-separate list of tags shown in the following example:

ProductIdProductId NomeName MarcasTags
11 Full-Finger GlovesFull-Finger Gloves clothing, road, touring, bikeclothing,road,touring,bike
22 LL HeadsetLL Headset bikebike
33 HL Mountain FrameHL Mountain Frame bike, mountainbike,mountain

A seguinte consulta transforma cada lista de marcas e une-as com a linha 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, ',');  

Aqui está o conjunto de resultados.Here is the result set.

ProductIdProductId NomeName valuevalue
11 Full-Finger GlovesFull-Finger Gloves clothingclothing
11 Full-Finger GlovesFull-Finger Gloves roadroad
11 Full-Finger GlovesFull-Finger Gloves touringtouring
11 Full-Finger GlovesFull-Finger Gloves bikebike
22 LL HeadsetLL Headset bikebike
33 HL Mountain FrameHL Mountain Frame bikebike
33 HL Mountain FrameHL Mountain Frame mountainmountain

Observação

A ordem da saída pode variar, uma vez que não há garantia de que a ordem corresponda à ordem das subcadeias de caracteres na cadeia 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. Agregação por valoresAggregation by values

Os usuários precisam criar um relatório que mostra o número de produtos por marca, ordenado pelo número de produtos, e filtrar apenas as marcas com mais de dois produtos.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. Pesquisar por valor de marcaSearch by tag value

Os desenvolvedores precisam criar consultas que localizam artigos por palavras-chave.Developers must create queries that find articles by keywords. Eles podem usar as seguintes consultas:They can use following queries:

Para localizar produtos com uma única marca (clothing):To find products with a single tag (clothing):

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

Localize produtos com duas marcas especificadas (clothing e 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. Localizar linhas pela lista de valoresFind rows by list of values

Os desenvolvedores precisam criar uma consulta que localiza artigos por uma lista de IDs.Developers must create a query that finds articles by a list of IDs. Eles podem usar a seguinte consulta:They can use following query:

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

O uso de STRING_SPLIT anterior é uma substituição para um antipadrão comum.The preceding STRING_SPLIT usage is a replacement for a common anti-pattern. Esse antipadrão pode envolver a criação de uma cadeia de caracteres SQL dinâmica na camada de aplicativo ou no Transact-SQL.Such an anti-pattern can involve the creation of a dynamic SQL string in the application layer or in Transact-SQL. Ou um antipadrão pode ser obtido usando o operador LIKE.Or an anti-pattern can be achieved by using the LIKE operator. Confira a seguinte instrução SELECT de exemplo:See the following example SELECT statement:

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

Consulte TambémSee Also

LEFT (Transact-SQL)LEFT (Transact-SQL)
LTRIM (Transact-SQL)LTRIM (Transact-SQL)
RIGHT (Transact-SQL)RIGHT (Transact-SQL)
RTRIM (Transact-SQL)RTRIM (Transact-SQL)
SUBSTRING (Transact-SQL)SUBSTRING (Transact-SQL)
TRIM (Transact-SQL)TRIM (Transact-SQL)
Funções de cadeia de caracteres (Transact-SQL)String Functions (Transact-SQL)