Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för: SQL Server 2016 (13.x) och senare versioner
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse AnalyticsSQL Analytics-slutpunkt
i Microsoft Fabric
Warehouse i Microsoft Fabric
STRING_SPLIT är en tabellvärdesfunktion som delar upp en sträng i rader med delsträngar, baserat på ett angivet avgränsartecken.
Kompatibilitetsnivå 130
STRING_SPLIT kräver att kompatibilitetsnivån är minst 130. När nivån är mindre än 130 kan databasmotorn inte hitta STRING_SPLIT funktionen.
Om du vill ändra kompatibilitetsnivån för en databas läser du Visa eller ändra kompatibilitetsnivån för en databas.
Anmärkning
Kompatibilitetskonfiguration behövs inte för STRING_SPLIT i Azure Synapse Analytics.
Transact-SQL syntaxkonventioner
Syntax
STRING_SPLIT ( string , separator [ , enable_ordinal ] )
Arguments
string
Ett uttryck av valfri teckentyp (till exempel nvarchar, varchar, nchar eller char).
separator
Ett uttryck med ett enda tecken av valfri teckentyp (till exempel nvarchar(1), varchar(1), nchar(1)eller char(1)) som används som avgränsare för sammanfogade delsträngar.
enable_ordinal
Gäller för: Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics (endast serverlös SQL-pool) och SQL Server 2022 (16.x) och senare versioner
Ett int- eller bituttryck som fungerar som en flagga för att aktivera eller inaktivera utdatakolumnenordinal. Värdet 1 för aktiverar ordinal kolumnen. Om enable_ordinal utelämnas, NULLeller har värdet 0, ordinal inaktiveras kolumnen.
Returtyper
Om utdatakolumnen ordinal inte är aktiverad STRING_SPLIT returnerar en tabell med en kolumn vars rader är delsträngarna. Namnet på kolumnen är value. Den returnerar nvarchar om något av indataargumenten antingen är nvarchar eller nchar. Annars returneras varchar. Längden på returtypen är samma som längden på strängargumentet .
Om argumentet enable_ordinal skickas ett värde av 1returneras en andra kolumn med namnet ordinal som består av de 1-baserade indexvärdena för varje understrängs position i indatasträngen. Returtypen är bigint.
Anmärkningar
STRING_SPLIT matar in en sträng som har avgränsade delsträngar och matar in ett tecken som ska användas som avgränsare eller avgränsare. Om du vill kan funktionen ha stöd för ett tredje argument med värdet 0 eller 1 som inaktiverar respektive aktiverar utdatakolumnen ordinal .
STRING_SPLIT matar ut en tabell med en kolumn eller dubbelkolumn, beroende på argumentet enable_ordinal .
Om enable_ordinal är
NULL, utelämnas eller har värdet0,STRING_SPLITreturneras en tabell med en kolumn vars rader innehåller delsträngarna. Namnet på utdatakolumnen ärvalue.Om enable_ordinal har värdet
1returnerar funktionen en tabell med två kolumner, inklusive kolumnenordinalsom består av de 1-baserade indexvärdena för delsträngarna i den ursprungliga indatasträngen.
Argumentet enable_ordinal måste vara ett konstant värde, inte en kolumn eller variabel. Det måste också vara en bit - eller int-datatyp med värdet 0 eller 1. Annars genererar funktionen ett fel.
Utdataraderna kan vara i valfri ordning. Ordningen är inte garanterad att matcha ordningen för delsträngarna i indatasträngen. Du kan åsidosätta den slutliga sorteringsordningen med hjälp av en ORDER BY sats i -instruktionen SELECT , ORDER BY value till exempel eller ORDER BY ordinal.
0x0000 (char(0)) är ett odefinierat tecken i Windows-sortering och kan inte inkluderas i STRING_SPLIT.
Tomma nolllängdsundersträngar finns när indatasträngen innehåller två eller flera efterföljande förekomster av avgränsarens tecken. Tomma delsträngar behandlas på samma sätt som vanliga delsträngar. Du kan filtrera bort alla rader som innehåller den tomma delsträngen WHERE med hjälp av -satsen, till exempel WHERE value <> ''. Om indatasträngen är NULLSTRING_SPLIT returnerar funktionen table-valued en tom tabell.
I följande SELECT instruktion används till exempel blankstegstecknet som avgränsare:
SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');
I en övningskörning returnerade föregående SELECT resultattabell:
| värde |
|---|
Lorem |
ipsum |
dolor |
sit |
amet. |
I följande exempel aktiveras ordinal kolumnen genom att skicka 1 för det valfria tredje argumentet:
SELECT * FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ', 1);
Den här instruktionen returnerar sedan följande resultattabell:
| värde | Ordinal |
|---|---|
Lorem |
1 |
ipsum |
2 |
dolor |
3 |
sit |
4 |
amet. |
5 |
Examples
A. Dela kommaavgränsad värdesträng
Parsa en kommaavgränsad lista med värden och returnera alla icke-tomma token:
DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'
SELECT value
FROM STRING_SPLIT(@tags, ',')
WHERE RTRIM(value) <> '';
STRING_SPLIT returnerar en tom sträng om det inte finns något mellan avgränsaren. Villkoret RTRIM(value) <> '' tar bort tomma token.
B. Dela kommaavgränsad värdesträng i en kolumn
Produkttabellen har en kolumn med kommaavgränsad lista med taggar som visas i följande exempel:
| Produkt-ID | Namn | Etiketter |
|---|---|---|
1 |
Full-Finger Gloves |
clothing,road,touring,bike |
2 |
LL Headset |
bike |
3 |
HL Mountain Frame |
bike,mountain |
Följande fråga transformerar varje lista med taggar och kopplar dem till den ursprungliga raden:
SELECT ProductId, Name, value
FROM Product
CROSS APPLY STRING_SPLIT(Tags, ',');
Här är resultatet.
| Produkt-ID | Namn | Värde |
|---|---|---|
1 |
Full-Finger Gloves |
clothing |
1 |
Full-Finger Gloves |
road |
1 |
Full-Finger Gloves |
touring |
1 |
Full-Finger Gloves |
bike |
2 |
LL Headset |
bike |
3 |
HL Mountain Frame |
bike |
3 |
HL Mountain Frame |
mountain |
Anmärkning
Ordningen på utdata kan variera eftersom ordningen inte garanteras matcha ordningen för delsträngarna i indatasträngen.
C. Sammansättning efter värden
Användarna måste skapa en rapport som visar antalet produkter per tagg, sorterade efter antal produkter och för att endast filtrera taggarna med fler än två produkter.
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. Sök efter taggvärde
Utvecklare måste skapa frågor som hittar artiklar efter nyckelord. De kan använda följande frågor:
Så här hittar du produkter med en enda tagg (kläder):
SELECT ProductId, Name, Tags
FROM Product
WHERE 'clothing' IN (SELECT value FROM STRING_SPLIT(Tags, ','));
Hitta produkter med två angivna taggar (kläder och väg):
SELECT ProductId, Name, Tags
FROM Product
WHERE EXISTS (SELECT *
FROM STRING_SPLIT(Tags, ',')
WHERE value IN ('clothing', 'road'));
E. Hitta rader efter lista med värden
Utvecklare måste skapa en fråga som hittar artiklar i en lista med ID:er. De kan använda följande fråga:
SELECT ProductId, Name, Tags
FROM Product
JOIN STRING_SPLIT('1,2,3',',')
ON value = ProductId;
Föregående STRING_SPLIT användning är en ersättning för ett vanligt antimönster. Ett sådant antimönster kan omfatta skapandet av en dynamisk SQL-sträng i programskiktet eller i Transact-SQL. Eller så kan ett antimönster uppnås med hjälp av operatorn LIKE . Se följande exempelsats SELECT :
SELECT ProductId, Name, Tags
FROM Product
WHERE ',1,2,3,' LIKE '%,' + CAST(ProductId AS VARCHAR(20)) + ',%';
F. Hitta rader efter ordningsvärden
Följande instruktion hittar alla rader med ett jämnt indexvärde:
SELECT *
FROM STRING_SPLIT('Austin,Texas,Seattle,Washington,Denver,Colorado', ',', 1)
WHERE ordinal % 2 = 0;
Ovanstående instruktion returnerar följande tabell:
| värde | Ordinal |
|---|---|
| Texas | 2 |
| Washington | 4 |
| Colorado | 6 |
G. Sortera rader efter ordningsvärden
Följande instruktion returnerar delsträngsvärdena för delsträngen för indatasträngen och deras ordningstal, ordnade efter ordinal kolumnen:
SELECT * FROM STRING_SPLIT('E-D-C-B-A', '-', 1) ORDER BY ordinal DESC;
Ovanstående instruktion returnerar följande tabell:
| värde | Ordinal |
|---|---|
| A | 5 |
| B | 4 |
| C | 3 |
| D | 2 |
| E | 1 |