Sådan opdeles en streng med en afgrænset tegn i SQL Server?

I denne artikel vil vi diskutere flere måder at opdele den afgrænsede strengværdi på. Det kan opnås ved hjælp af flere metoder, herunder.

  • Brug af STRING_SPLIT-funktionen til at opdele strengen
  • Opret en brugerdefineret tabel-værdiansat funktion for at opdele strengen,
  • Brug XQuery til at opdele strengværdien og omdanne en afgrænset streng til XML

Først og fremmest er vi nødt til at oprette en tabel og indsætte data i den, som vil blive brugt i alle tre metoder. Tabellen skal indeholde en enkelt række med felt-id og streng med afgrænsningstegn i. Opret en tabel med navnet "student" ved hjælp af følgende kode.

OPRET TABELstuderende (ID INT IDENTITET (1, 1), studentnavn VARCHAR (MAX))

Indsæt elevnavne adskilt med kommaer i en enkelt række ved at udføre følgende kode.

INDSÆT I studerende (studentnavn) VÆRDIER ('Monroy, Montanez, Marolahakis, Negley, Albright, Garofolo, Pereira, Johnson, Wagner, Conrad')

Kontroller, om data er indsat i tabellen eller ikke bruger følgende kode.

vælg * fra studerende

Metode 1: Brug STRING_SPLIT-funktionen til at opdele strengen

I SQL Server 2016, “STRING_SPLIT” funktion blev introduceret, som kan bruges med kompatibilitetsniveau 130 og derover. Hvis du bruger 2016 SQL Server-version eller nyere, kan du bruge denne indbyggingsfunktion.

desuden “STRING_SPLIT” indtaster en streng, der har afgrænset understrenge og indtaster et tegn, der skal bruges som afgrænser eller separator. Funktionen udsender en enkeltkolonnetabel, hvis rækker indeholder understrengene. Navnet på outputkolonnen er “Værdi". Denne funktion får to parametre. Den første parameter er en streng, og den anden er skilletegn eller separator baseret på hvilken vi skal dele strengen. Outputtet indeholder en enkeltkolonnetabel, hvorunder strenge er til stede. Denne outputkolonne er navngivet "Værdi" som vi kan se i nedenstående figur. Desuden er “STRING SPLIT” tabel_værdifunktion returnerer en tom tabel, hvis inputstrengen er NULL.

Databasens kompatibilitetsniveau:

Hver database er forbundet med et kompatibilitetsniveau. Det gør det muligt for databasens adfærd at være kompatibel med den bestemte SQL Server-version, den kører på.

Nu vil vi kalde "string_split" -funktionen for at dele streng afgrænset med kommaer. Men kompatibilitetsniveauet var mindre end 130, hvorfor følgende fejl blev hævet. "Ugyldigt objektnavn 'SPLIT_STRING'"

Derfor er vi nødt til at indstille databaskompatibilitetsniveauet til 130 eller højere. Så vi følger dette trin for at indstille kompatibilitetsniveauet for databasen.

  • Indstil først databasen til “single_user_access_mode” ved hjælp af følgende kode.
ALTER DATABASE SET SINGLE_USER
  • For det andet skal du ændre kompatibilitetsniveauet for databasen ved hjælp af følgende kode.
ALTER DATABASE SET COMPATIBILITY_LEVEL = 130
  • Sæt databasen tilbage til flerbrugeradgangstilstand ved hjælp af følgende kode.
ALTER DATABASE SET MULTI_USER
BRUG [master] GO ALTER DATABASE [bridge_centralality] SET SINGLE_USER ALTER DATABASE [bridge_centralality] SET COMPATIBILITY_LEVEL = 130 ALTER DATABASE [bridge_centralality] SET MULTI_USER GO

Outputtet vil være:

Kør nu denne kode for at få det krævede resultat.

ERKLÆR @string_value VARCHAR (MAX); SET @ string_value = 'Monroy, Montanez, Marolahakis, Negley, Albright, Garofolo, Pereira, Johnson, Wagner, Conrad' SELECT * FRA STRING_SPLIT (@string_value, ',')

Output for denne forespørgsel vil være:

Metode 2: For at opdele strengen skal du oprette en brugerdefineret tabelværdifunktion

Bestemt understøttes denne traditionelle metode af alle versioner af SQL Server. I denne teknik opretter vi brugerdefineret funktion til at opdele strengen med afgrænset karakter ved hjælp af “SUBSTRING”Funktion,“CHARINDEX”Og mens sløjfe. Denne funktion kan bruges til at føje data til outputtabellen, da dens returtype er "tabel".

OPRET FUNKTION [dbo]. [Split_string] (@string_value NVARCHAR (MAX), @delimiter_character CHAR (1)) RETURNS @result_set TABEL (splited_data NVARCHAR (MAX)) BEGIN DEKLARE @ start_position INT, @ending_position INT SELECT @ start_position = @ending_position = CHARINDEX (@delimiter_character, @string_value) WHILE @ start_position <LEN (@string_value) + 1 BEGIN IF @ending_position = 0 SET @ending_position = LEN (@string_value) + 1 INSERT INTO @result_set (splited_data) VALUES (SUBSTRING @streng_værdi, @start_position, @ending_position - @start_position)) SET @start_position = @ending_position + 1 SET @ending_position = CHARINDEX (@delimiter_character, @string_value, @start_position) END RETURN END

Udfør nu scriptet nedenfor for at kalde en splitfunktion til splitstreng efter skilletegn.

ERKLÆR @student_name VARCHAR (MAX); ERKLÆR @delimiter CHAR (1); SET @ delimiter = ',' SET @student_name = (VÆLG studentnavn fra studerende) VÆLG * FRA dbo.split_string (@student_name, @delimiter)

Resultatsættet bliver sådan.

Metode 3: Brug XQuery til at opdele strengværdien og omdanne en afgrænset streng til XML

Da brugerdefinerede funktioner er ressourceudtømmende, skal vi undgå disse funktioner. En anden mulighed er indbygget “string_split” -funktion, men denne funktion kan bruges til en database, hvis kompatibilitetsniveau er 130 eller højere. Så her kommer en anden løsning til at løse denne vanskelige opgave. En streng kan opdeles ved hjælp af følgende XML.

ERKLÆR @xml_value AS XML, @string_value AS VARCHAR (2000), @delimiter_value AS VARCHAR (15) SET @ string_value = (SELECT student_name FROM student) SET @delimiter_value = ',' SET @xml_value = Cast (('' + Erstat ( @string_value, @delimiter_value, '') + '') AS XML) VÆLG @xml_value

Outputtet for denne forespørgsel vil være:

Hvis du vil se hele XML-filen. Klik på linket. Når du har klikket på, vil linkkoden se sådan ud.

Nu skal XML-streng behandles yderligere. Endelig bruger vi “x-Query” til at forespørge fra XML.

ERKLÆR @xml_value AS XML, @string_value AS VARCHAR (2000), @delimiter_value AS VARCHAR (15) SET @ string_value = (SELECT student_name FROM student) SET @delimiter_value = ',' SET @xml_value = Cast (('' + Erstat ( @string_value, @delimiter_value, '') + '') AS XML) VÆLG xmquery ('.'). værdi ('.', 'VARCHAR (15)') SOM VÆRDI FRA @ xml_value.nodes ('/ studentnavn' ) AS x (m) 

Outputtet vil være sådan: