Kako razdeliti niz z ločenim znakom v strežniku SQL Server?

V tem članku bomo razpravljali o več načinih razdelitve ločene vrednosti niza. To je mogoče doseči z uporabo več metod, vključno z.

  • Uporaba funkcije STRING_SPLIT za razdelitev niza
  • Ustvarite uporabniško določeno funkcijo z vrednostjo tabele za razdelitev niza,
  • Uporabite XQuery za razdelitev vrednosti niza in pretvoritev ločenega niza v XML

Najprej moramo ustvariti tabelo in vanjo vstaviti podatke, ki bodo uporabljeni v vseh treh metodah. Tabela mora vsebovati eno vrstico z ID-jem polja in nizom z ločilnimi znaki. Ustvarite tabelo z imenom "študent" z uporabo naslednje kode.

USTVARI TABELO študenta (ID INT IDENTITY (1, 1), student_name VARCHAR (MAX))

V eno vrstico vstavite imena študentov, ločena z vejicami, tako da izvedete naslednjo kodo.

VSTAVITE V VREDNOTE študenta (ime_djake) ('Monroy, Montanez, Marolahakis, Negley, Albright, Garofolo, Pereira, Johnson, Wagner, Conrad')

Preverite, ali so bili podatki vstavljeni v tabelo ali ne, z uporabo naslednje kode.

izberite * med študentom

1. način: Za razdelitev niza uporabite funkcijo STRING_SPLIT

V SQL Server 2016, »STRING_SPLIT« uvedena je bila funkcija, ki se lahko uporablja s stopnjo združljivosti 130 in več. Če uporabljate različico SQL Server 2016 ali novejšo, lahko uporabite to vgrajeno funkcijo.

Poleg tega »STRING_SPLIT« vnese niz z ločenimi podnizami in vnese en znak, ki ga bo uporabil kot ločilo ali ločilo. Funkcija prikaže tabelo z enim stolpcem, katere vrstice vsebujejo podnize. Ime izhodnega stolpca je »Vrednost ". Ta funkcija dobi dva parametra. Prvi parameter je niz, drugi pa ločilni znak ali ločilo, na podlagi katerega moramo niz razdeliti. Izhod vsebuje tabelo z enim stolpcem, v kateri so podnizi. Ta izhodni stolpec je imenovan "Vrednost" kot lahko vidimo na spodnji sliki. Poleg tega »STRING SPLIT« funkcija table_valued vrne prazno tabelo, če je vhodni niz NULL.

Raven združljivosti baze podatkov:

Vsaka baza podatkov je povezana s stopnjo združljivosti. Omogoča, da je vedenje baze podatkov združljivo z določeno različico strežnika SQL Server, v kateri deluje.

Zdaj bomo poklicali funkcijo "string_split", da razdelimo niz, ločen z vejicami. Toda stopnja združljivosti je bila manjša od 130, zato je prišlo do napake. "Neveljavno ime predmeta" SPLIT_STRING ""

Tako moramo stopnjo združljivosti zbirke podatkov nastaviti na 130 ali več. Zato bomo sledili tem korakom za nastavitev stopnje združljivosti baze podatkov.

  • Najprej nastavite bazo podatkov na “single_user_access_mode” z uporabo naslednje kode.
ALTER DATABASE SET SINGLE_USER
  • Drugič, spremenite stopnjo združljivosti baze podatkov z uporabo naslednje kode.
ALTER DATABASE SET COMPATIBILITY_LEVEL = 130
  • Z naslednjo kodo vrnite bazo podatkov v način za več uporabnikov.
ALTER DATABASE SET MULTI_USER
USE [master] GO ALTER DATABASE [bridge_centrality] SET SINGLE_USER ALTER DATABASE [bridge_centrality] SET COMPATIBILITY_LEVEL = 130 ALTER DATABASE [bridge_centrality] SET MULTI_USER GO

Rezultat bo:

Zdaj zaženite to kodo, da dobite zahtevani rezultat.

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

Rezultat za to poizvedbo bo:

2. metoda: Če želite razdeliti niz, ustvarite uporabniško določeno funkcijo, vrednoteno s tabelo

Seveda to tradicionalno metodo podpirajo vse različice strežnika SQL Server. V tej tehniki bomo ustvarili uporabniško določeno funkcijo za razdelitev niza z ločenim znakom z uporabo "PODLOGA"Funkcija,"CHARINDEX«In while zanka. To funkcijo lahko uporabite za dodajanje podatkov v izhodno tabelo, saj je njen povratni tip »tabela«.

USTVARI FUNKCIJO [dbo]. [Split_string] (@string_value NVARCHAR (MAX), @delimiter_character CHAR (1)) RETURNS @result_set TABLE (splited_data NVARCHAR (MAX)) BEGIN DECLARE @start_position INT, @start_position INT SELECT @, start_position INT SELECT @, start_position INT SELECT @ending_position = CHARINDEX (@delimiter_character, @string_value), MED @start_position <LEN (@string_value) + 1 ZAČETEK, ČE @ending_position = 0 SET @ending_position = LEN (@string_value) + 1 INSERT INTO @result_set (splited_dataSTR @string_value, @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

Zdaj zaženite spodnji skript, da pokličete funkcijo deljenja, da razdeli niz po ločevalnem znaku.

IZJAVITE @ ime študenta VARCHAR (MAX); DECLARE @delimiter CHAR (1); SET @ delimiter = ',' SET @student_name = (SELECT student_name FROM student) SELECT * FROM dbo.split_string (@student_name, @delimiter)

Nabor rezultatov bo takšen.

3. metoda: Uporabite XQuery za razdelitev vrednosti niza in pretvoritev ločenega niza v XML

Ker so uporabniško določene funkcije izčrpne, se moramo tem funkcijam izogibati. Druga možnost je vgrajena funkcija "string_split", vendar jo je mogoče uporabiti za zbirko podatkov, za katero je stopnja združljivosti 130 ali več. Prihaja torej še ena rešitev za rešitev te težke naloge. Niz lahko razdelite z naslednjim XML.

DECLARE @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 (('' + Replace ( @string_value, @delimiter_value, '') + '') AS XML) SELECT @xml_value

Rezultat za to poizvedbo bo:

Če si želite ogledati celotno datoteko XML. Kliknite povezavo. Ko kliknete kodo povezave, bo videti tako.

Zdaj je treba XML niz nadalje obdelati. Na koncu bomo za poizvedbo iz XML uporabili »x-Query«.

DECLARE @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 (('' + Replace ( @string_value, @delimiter_value, '') + '') AS XML) SELECT xmquery ('.'). value ('.', 'VARCHAR (15)') AS VALUE FROM @ xml_value.nodes ('/ studentname' ) AS x (m) 

Rezultat bo takšen: