Sie können eine Number-Tabelle nutzen, um das Zeichenparsen durchzuführen.
Erstellen Sie eine physische Zahlen-Tabelle:
create table dbo.Numbers (N int primary key);
insert into dbo.Numbers
select top 1000 row_number() over(order by number) from master..spt_values
go
Erstellen Sie eine Testtabelle mit 1000000 Zeilen
create table #yak (i int identity(1,1) primary key, array varchar(50))
insert into #yak(array)
select 'a,b,c' from dbo.Numbers n cross join dbo.Numbers nn
go
Erstellen Sie die Funktion
create function [dbo].[ufn_ParseArray]
( @Input nvarchar(4000),
@Delimiter char(1) = ',',
@BaseIdent int
)
returns table as
return
( select row_number() over (order by n asc) + (@BaseIdent - 1) [i],
substring(@Input, n, charindex(@Delimiter, @Input + @Delimiter, n) - n) s
from dbo.Numbers
where n <= convert(int, len(@Input)) and
substring(@Delimiter + @Input, n, 1) = @Delimiter
)
go
Verwendung (gibt 3 Millionen Zeilen in 40 Sekunden auf meinem Laptop aus)
select *
from #yak
cross apply dbo.ufn_ParseArray(array, ',', 1)
Bereinigung
drop table dbo.Numbers;
drop function [dbo].[ufn_ParseArray]
Die Leistung hier ist nicht beeindruckend, aber das Aufrufen einer Funktion über einer Million Zeilen in einer Tabelle ist keine gute Idee. Wenn Sie ein Zeichenaufteilen über viele Zeilen durchführen müssen, würde ich die Funktion vermeiden.
3 Stimmen
Siehe stackoverflow.com/questions/314824/… ebenfalls
5 Stimmen
Die höchsten Antworten hier sind - zumindest für mich - ziemlich altmodisch und eher veraltet. Prozedurale Logik, Schleifen, Rekursionen, CLR, Funktionen, viele Codezeilen... Es könnte interessant sein, die "aktiven" Antworten zu lesen, um aktuellere Ansätze zu finden.
0 Stimmen
Ich habe eine neue Antwort mit einem aktuelleren Ansatz hinzugefügt: stackoverflow.com/a/49669994/632604
0 Stimmen
Versuchen Sie Holen Sie sich das n-te Element einer Liste -> portosql.wordpress.com/2019/05/27/enesimo-elemento-lista
0 Stimmen
Einige Kommentare (einschließlich eines von mir) wurden gelöscht. Möchte sich einer der Moderatoren äußern?
1 Stimmen
@TimAbell, die Dokumentation besagt, dass "Die Reihenfolge entspricht möglicherweise nicht der Reihenfolge der Teilzeichenfolgen im Eingabestring".
0 Stimmen
@TimAbell Ja, ja... aber wie erhält man ein EINZELNES Ergebnis nach Index aus dem Ergebnis von
STRING_SPLIT
???0 Stimmen
Bis zur SQL Server 2022 ist die zuverlässigste Lösung
string_split
mit Ordinal. Siehe stackoverflow.com/a/70196925/87015