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

GILT FÜR: jaSQL Server jaAzure SQL-DatenbankjaAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse noParallel Data Warehouse

Eine Tabellenwertfunktion, die eine Zeichenfolge basierend auf einem angegebenen Trennzeichen in Zeilen mit Teilzeichenfolgen unterteilt.A table-valued function that splits a string into rows of substrings, based on a specified separator character.

Kompatibilitätsgrad 130Compatibility level 130

Für STRING_SPLIT ist mindestens der Kompatibilitätsgrad 130 erforderlich.STRING_SPLIT requires the compatibility level to be at least 130. Bei einem Grad unter 130 kann SQL Server die STRING_SPLIT-Funktion nicht finden.When the level is less than 130, SQL Server is unable to find the STRING_SPLIT function.

Unter Anzeigen oder Ändern des Kompatibilitätsgrads einer Datenbank finden Sie Informationen zum Ändern des Datenbank-Kompatibilitätsgrads.To change the compatibility level of a database, refer to View or Change the Compatibility Level of a Database.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

STRING_SPLIT ( string , separator )  

ArgumenteArguments

Zeichenfolgestring
Ist ein Ausdruck eines beliebigen Zeichentyps (z.B. nvarchar, varchar, nchar oder char).Is an expression of any character type (for example, nvarchar, varchar, nchar, or char).

Trennzeichenseparator
Ein Ausdruck mit einem einzelnen Zeichen jedes beliebigen Zeichentyps (z.B. nvarchar(1) , varchar(1) , nchar(1) oder char(1) ), der als Trennzeichen für verkettete Teilzeichenfolgen verwendet wird.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.

RückgabetypenReturn Types

Gibt eine einspaltige Tabelle zurück, deren Zeilen die Teilzeichenfolgen sind.Returns a single-column table whose rows are the substrings. Der Name der Spalte ist value.The name of the column is value. Gibt nvarchar zurück, wenn eines der Eingabeargumente entweder nvarchar oder nchar ist,Returns nvarchar if any of the input arguments are either nvarchar or nchar. andernfalls wird varchar zurückgegeben.Otherwise returns varchar. Die Länge des Rückgabetyps unterscheidet sich nicht von der Länge des Zeichenfolgenarguments.The length of the return type is the same as the length of the string argument.

BemerkungenRemarks

STRING_SPLIT gibt eine Zeichenfolge mit getrennten Teilzeichenfolgen und ein Zeichen ein, das als Trennzeichen oder Trennlinie verwendet werden kann.STRING_SPLIT inputs a string that has delimited substrings, and inputs one character to use as the delimiter or separator. STRING_SPLIT gibt eine einspaltige Tabelle aus, deren Zeilen die Teilzeichenfolgen enthalten.STRING_SPLIT outputs a single-column table whose rows contain the substrings. Der Name der Ausgabespalte ist value.The name of the output column is value.

Die Ausgabezeilen können in beliebiger Reihenfolge sein.The output rows might be in any order. Die Reihenfolge ist nicht stimmt nicht garantiert mit der Reihenfolge der Teilzeichenfolgen in der Eingabezeichenfolge überein.The order is not guaranteed to match the order of the substrings in the input string. Sie können die endgültige Sortierreihenfolge überschreiben, indem Sie in der SELECT-Anweisung (ORDER BY value) eine ORDER BY-Klausel verwenden.You can override the final sort order by using an ORDER BY clause on the SELECT statement (ORDER BY value).

Leere Teilzeichenfolgen der Länge null sind vorhanden, wenn die Eingabezeichenfolge zwei oder mehr aufeinanderfolgende Vorkommen des Trennzeichens enthält.Empty zero-length substrings are present when the input string contains two or more consecutive occurrences of the delimiter character. Leere Teilzeichenfolgen werden genauso behandelt wie normale Teilzeichenfolgen.Empty substrings are treated the same as are plain substrings. Sie können alle Zeilen, die die leere Teilzeichenfolge enthalten, mit der WHERE-Klausel (WHERE value <> '') herausfiltern.You can filter out any rows that contain the empty substring by using the WHERE clause (WHERE value <> ''). Wenn die Eingabezeichenfolge NULL ist, gibt die Tabellenwertfunktion STRING_SPLIT eine leere Tabelle zurück.If the input string is NULL, the STRING_SPLIT table-valued function returns an empty table.

Beispielsweise wird in der folgenden SELECT-Anweisung das Leerzeichen als Trennzeichen verwendet:As an example, the following SELECT statement uses the space character as the separator:

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

Bei einer praktischen Ausführung hat die vorstehende SELECT-Anweisung die folgende Ergebnistabelle zurückgegeben:In a practice run, the preceding SELECT returned following result table:

Wertvalue
LoremLorem
ipsumipsum
dolordolor
sitsit
amet.amet.
 

BeispieleExamples

A.A. Teilen einer Zeichenfolge mit durch Trennzeichen getrennten Werten (CSV)Split comma-separated value string

Analysieren einer durch Komma getrennten Liste von Werten und Zurückgeben aller nicht leeren Token: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 gibt eine leere Zeichenfolge zurück, wenn zwischen dem Trennzeichen nichts vorhanden ist.STRING_SPLIT will return empty string if there is nothing between separator. Die Bedingung RTRIM(value) <> '' entfernt leere Token.Condition RTRIM(value) <> '' will remove empty tokens.

B.B. Teilen einer Zeichenfolge mit durch Trennzeichen getrennten Werten in einer SpalteSplit comma-separated value string in a column

Die Produkttabelle verfügt über eine Spalte mit einer durch Komma getrennte Liste von Tags, wie in diesem Beispiel dargestellt wird:Product table has a column with comma-separate list of tags shown in the following example:

ProductIdProductId NameName TagsTags
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

Die folgende Abfrage wandelt jede Tagliste um und verknüpft sie mit der ursprünglichen Zeile: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, ',');  

Im Folgenden finden Sie das Resultset.Here is the result set.

ProductIdProductId NameName Wertvalue
11 Full-Finger GlovesFull-Finger Gloves clothingclothing
11 Full-Finger GlovesFull-Finger Gloves Straßeroad
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

Hinweis

Die Reihenfolge der Ausgabe kann abweichen, da diese nicht zwangsläufig mit der Reihenfolge der Teilzeichenfolgen in der Eingabezeichenfolge übereinstimmt.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. Aggregation nach WertenAggregation by values

Benutzer müssen einen Bericht erstellen, der die Anzahl der Produkte pro Tag anzeigt, die nach der Anzahl der Produkte geordnet ist, und sie dürfen nur die Tags mit mehr als zwei Produkten filtern.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. Nach Tagwert suchenSearch by tag value

Entwickler müssen Abfragen erstellen, die Artikel nach Schlüsselwörtern finden.Developers must create queries that find articles by keywords. Sie können folgende Abfragen verwenden:They can use following queries:

Um Produkte mit einem einzelnen Tag zu finden (clothing):To find products with a single tag (clothing):

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

Produkte mit zwei angegebenen Tags finden (clothing und 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. Suchen nach Zeilen nach einer Liste von WertenFind rows by list of values

Entwickler müssen eine Abfrage erstellen, die Artikel nach einer Liste von IDs sucht.Developers must create a query that finds articles by a list of IDs. Sie können die folgende Abfrage verwenden:They can use following query:

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

Die vorhergehende Verwendung von STRING_SPLIT ist ein Ersatz für ein gängiges Antimuster.The preceding STRING_SPLIT usage is a replacement for a common anti-pattern. Ein solches Antimuster kann die Erstellung einer dynamischen SQL-Zeichenfolge auf der Anwendungsschicht oder in Transact-SQL mit einbeziehen.Such an anti-pattern can involve the creation of a dynamic SQL string in the application layer or in Transact-SQL. Ein Antimuster kann auch mit dem LIKE-Operator erreicht werden.Or an anti-pattern can be achieved by using the LIKE operator. Siehe das folgende Beispiel einer SELECT-Anweisung:See the following example SELECT statement:

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

Weitere InformationenSee 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)
Zeichenfolgenfunktionen (Transact-SQL)String Functions (Transact-SQL)