Hvordan dele en streng med et avgrenset tegn i SQL Server?

I denne artikkelen vil vi diskutere flere måter å dele den avgrensede strengverdien på. Det kan oppnås ved å bruke flere metoder, inkludert.

  • Bruk av STRING_SPLIT-funksjonen til å dele strengen
  • Opprett en brukerdefinert tabellverdi-funksjon for å dele strengen,
  • Bruk XQuery til å dele strengverdien og transformere en avgrenset streng til XML

Først og fremst må vi lage en tabell og sette inn data i den som skal brukes i alle tre metodene. Tabellen skal inneholde en enkelt rad med felt-ID og streng med skilletegn i. Lag en tabell med navnet "student" ved hjelp av følgende kode.

OPPRETT TABELL student (ID INT IDENTITET (1, 1), studentnavn VARCHAR (MAX))

Sett inn studentnavn adskilt med komma i en enkelt rad ved å utføre følgende kode.

INSERT INTO student (student_name) VALUES ('Monroy, Montanez, Marolahakis, Negley, Albright, Garofolo, Pereira, Johnson, Wagner, Conrad')

Bekreft om data er satt inn i tabellen eller ikke bruker følgende kode.

velg * fra studenten

Metode 1: Bruk STRING_SPLIT-funksjonen til å dele strengen

I SQL Server 2016, “STRING_SPLIT” funksjonen ble introdusert som kan brukes med kompatibilitetsnivå 130 og oppover. Hvis du bruker 2016 SQL Server-versjonen eller nyere, kan du bruke denne innebygde funksjonen.

Dessuten “STRING_SPLIT” legger inn en streng som har avgrenset understrenger og skriver inn ett tegn som skal brukes som skilletegn eller skilletegn. Funksjonen sender ut en enkeltkolonnetabell hvis rader inneholder understrengene. Navnet på utdatakolonnen er “Verdi". Denne funksjonen får to parametere. Den første parameteren er en streng, og den andre er skilletegn eller skilletegn som vi må dele strengen på. Utgangen inneholder en enkeltkolonnetabell der understrengene er til stede. Denne utgangskolonnen heter "Verdi" som vi kan se i figuren nedenfor. Videre, den “STRING SPLIT” table_valued-funksjonen returnerer en tom tabell hvis inngangsstrengen er NULL.

Databasens kompatibilitetsnivå:

Hver database er koblet til et kompatibilitetsnivå. Det gjør at databasens atferd kan være kompatibel med den spesielle SQL Server-versjonen den kjører på.

Nå vil vi kalle “string_split” -funksjonen for å dele streng avgrenset av komma. Men kompatibilitetsnivået var mindre enn 130, og følgende feil ble hevet. “Ugyldig objektnavn‘ SPLIT_STRING ’”

Derfor må vi sette databasekompatibilitetsnivået til 130 eller høyere. Så vi vil følge dette trinnet for å stille inn kompatibilitetsnivået til databasen.

  • Sett først databasen til “single_user_access_mode” ved å bruke følgende kode.
ALTER DATABASE SET SINGLE_USER
  • For det andre, endre kompatibilitetsnivået til databasen ved å bruke følgende kode.
ALTER DATABASE SET COMPATIBILITY_LEVEL = 130
  • Sett databasen tilbake til tilgang for flerbrukermodus ved å bruke følgende kode.
ALTER DATABASE SET MULTI_USER
BRUK [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

Resultatet blir:

Kjør nå denne koden for å få det nødvendige resultatet.

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, ',')

Resultatet for dette spørsmålet vil være:

Metode 2: For å dele strengen, opprett en brukerdefinert tabellverdi-funksjon

Denne tradisjonelle metoden støttes absolutt av alle versjoner av SQL Server. I denne teknikken vil vi lage brukerdefinert funksjon for å dele strengen med avgrenset tegn ved hjelp av “SUBSTRING”Funksjon,“CHARINDEX”Og mens løkke. Denne funksjonen kan brukes til å legge til data i utgangstabellen ettersom returtypen er "tabell".

OPPRETT FUNKSJON [dbo]. [Split_string] (@string_value NVARCHAR (MAX), @delimiter_character CHAR (1)) RETURNS @result_set TABLE (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 IN @ resultat_set (splited_data) VALUES (SUBSTRING) @streng_verdi, @start_posisjon, @ending_posisjon - @start_posisjon)) SET @start_position = @ending_position + 1 SET @ending_position = CHARINDEX (@delimiter_character, @string_value, @start_position) SLUT RETUR SLUT

Utfør nå skriptet nedenfor for å kalle en delt funksjon for å dele streng etter skilletegn.

ERKLÆR @student_name VARCHAR (MAX); ERKLÆR @delimiter CHAR (1); SET @ delimiter = ',' SET @ student_name = (VELG studentnavn FRA student) VELG * FRA dbo.split_string (@ student_name, @ delimiter)

Resultatsettet blir slik.

Metode 3: Bruk XQuery til å dele strengverdien og transformere en avgrenset streng til XML

Siden brukerdefinerte funksjoner er ressursuttømmende, må vi unngå disse funksjonene. Et annet alternativ er innebygd “string_split” -funksjon, men denne funksjonen kan brukes til en database der kompatibilitetsnivået er 130 eller høyere. Så her kommer en annen løsning for å løse denne vanskelige oppgaven. En streng kan deles ved hjelp av følgende XML.

ERKLÆR @xml_value AS XML, @string_value AS VARCHAR (2000), @delimiter_value AS VARCHAR (15) SET @ string_value = (VELG studentnavn fra FRA student) SET @ delimiter_value = ',' SET @ xml_value = Cast (('' + Erstatt ( @string_value, @delimiter_value, '') + '') AS XML) VELG @xml_value

Resultatet for dette spørsmålet vil være:

Hvis du vil se hele XML-filen. Klikk på lenken. Når du har klikket vil koblingskoden se slik ut.

Nå skal XML-streng behandles videre. Til slutt vil vi bruke "x-Query" til å spørre fra XML.

ERKLÆR @xml_value AS XML, @string_value AS VARCHAR (2000), @delimiter_value AS VARCHAR (15) SET @ string_value = (VELG studentnavn fra FRA student) SET @ delimiter_value = ',' SET @ xml_value = Cast (('' + Erstatt ( @string_value, @delimiter_value, '') + '') AS XML) VELG xmquery ('.'). verdi ('.', 'VARCHAR (15)') SOM VERDI FRA @ xml_value.nodes ('/ studentnavn' ) AS x (m) 

Resultatet blir slik: