Kuinka jakaa merkkijono erotetulla merkillä SQL Serverissä?

Tässä artikkelissa käsitellään useita tapoja jakaa rajattu merkkijonoarvo. Se voidaan saavuttaa käyttämällä useita menetelmiä, mukaan lukien.

  • Käytä STRING_SPLIT-toimintoa merkkijonon jakamiseen
  • Luo käyttäjän määrittelemä taulukon arvoinen funktio merkkijonon jakamiseksi,
  • Jaa merkkijonoarvo XQueryn avulla ja muunna erotettu merkkijono XML: ksi

Ensinnäkin meidän on luotava taulukko ja lisättävä siihen tietoja, joita käytetään kaikissa kolmessa menetelmässä. Taulukossa on oltava yksi rivi, jossa on kentän tunnus ja merkkijono, jossa on erotinmerkkejä. Luo taulukko nimeltä ”opiskelija” seuraavalla koodilla.

LUO TAULUKKO-opiskelija (ID-TUNNUS (1, 1), opiskelijan_nimi VARCHAR (MAX))

Lisää pilkuilla erotetut opiskelijoiden nimet yhdelle riville suorittamalla seuraava koodi.

INSERT INTO opiskelijan (opiskelijan_nimi) ARVOT ('Monroy, Montanez, Marolahakis, Negley, Albright, Garofolo, Pereira, Johnson, Wagner, Conrad')

Tarkista, onko tietoja lisätty taulukkoon, tai käytä seuraavaa koodia.

valitse * opiskelijasta

Tapa 1: Käytä merkkijonoa STRING_SPLIT-toiminnolla

SQL Server 2016: ssa "STRING_SPLIT" otettiin käyttöön toiminto, jota voidaan käyttää yhteensopivuustasolla 130 tai sitä uudemmalla. Jos käytät vuoden 2016 SQL Server -versiota tai uudempaa, voit käyttää tätä sisäänrakennustoimintoa.

Lisäksi "STRING_SPLIT" syöttää merkkijonon, joka on erottanut alijonot, ja syöttää yhden merkin käytettäväksi erottimena tai erottimena. Funktio antaa yhden sarakkeen taulukon, jonka rivit sisältävät alijonot. Tulosarakkeen nimi on “Arvo". Tämä toiminto saa kaksi parametria. Ensimmäinen parametri on merkkijono ja toinen on erotinmerkki tai erotin, jonka perusteella merkkijono on jaettava. Tulos sisältää yhden sarakkeen taulukon, jossa alaotsikot ovat läsnä. Tämä ulostulosarake on nimetty "Arvo" kuten voimme nähdä alla olevasta kuvasta. Lisäksi "STRING SPLIT" table_valued -funktio palauttaa tyhjän taulukon, jos syötemerkkijono on NULL.

Tietokannan yhteensopivuustaso:

Jokainen tietokanta on liitetty yhteensopivuustasoon. Sen avulla tietokannan toiminta on yhteensopiva tietyn SQL Server -version kanssa, jota se käyttää.

Kutsumme nyt "string_split" -toimintoa pilkulla erotetun merkkijonon jakamiseksi. Mutta yhteensopivuustaso oli alle 130, joten seuraava virhe nostettiin. "Virheellinen objektin nimi 'SPLIT_STRING' '

Siksi meidän on asetettava tietokannan yhteensopivuustasoksi vähintään 130. Joten seuraamme näitä vaiheita tietokannan yhteensopivuustason asettamiseksi.

  • Aseta ensin tietokannaksi ”single_user_access_mode” käyttämällä seuraavaa koodia.
VAIHDA TIETOKANTA-ASETUS YKSI
  • Toiseksi, muuta tietokannan yhteensopivuustasoa seuraavalla koodilla.
MUUTTU TIETOKANTA-ASETUS YHTEENSOPIVUUS_TASO = 130
  • Aseta tietokanta takaisin monikäyttäjätilaan seuraavan koodin avulla.
MUUTTU TIETOKANTAASETUS MULTI_USER
KÄYTÄ [master] GO ALTER DATABASE [bridge_centrality] SET SINGLE_USER ALTER DABABE [bridge_centrality] SET COMPATIBILITY_LEVEL = 130 ALTER DATABASE [bridge_centrality] SET MULTI_USER GO

Tulos on:

Suorita nyt tämä koodi saadaksesi vaaditun tuloksen.

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

Tämän kyselyn tulos on:

Menetelmä 2: Jos haluat jakaa merkkijonon, luo käyttäjän määrittelemä taulukkoarvoinen funktio

Varmasti tätä perinteistä menetelmää tukevat kaikki SQL Server -versiot. Tässä tekniikassa luomme käyttäjän määrittelemän funktion jakamaan merkkijono erotetulla merkillä käyttäenTUKIToiminto,CHARINDEX”Ja taas silmukka. Tätä toimintoa voidaan käyttää tietojen lisäämiseen lähtötaulukkoon, koska sen palautustyyppi on "taulukko".

Luo FUNCTION [dbo]. [Split_string] (@ string_value NVARCHAR (MAX), @delimiter_character CHAR (1)) RETURNS @result_set TABLE (split_data NVARCHAR (MAX)) BEGIN DECLARE @start_position INT, @stend_position INT @ending_position = CHARINDEX (@delimiter_character, @string_value) Samaan aikaan @start_position <LEN (@string_value) + 1 ALKU, JOS @ending_position = 0 SET @ending_position = LEN (@string_value) + 1 INSERT INTO @result_set (split_data) (split_data) @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

Suorita nyt alla oleva komentosarja kutsua split-toiminto jakamaan merkkijono erotinmerkillä.

ILMOITA @opiskelijanimi VARCHAR (MAX); ILMOITA @delimiter CHAR (1); SET @ delimiter = ',' SET @student_name = (VALITSE opiskelijan_nimi opiskelijalta) SELECT * FROM dbo.split_string (@student_name, @delimiter)

Tulosjoukko on tällainen.

Menetelmä 3: Jaa merkkijonoarvo XQueryn avulla ja muunna erotettu merkkijono XML: ksi

Koska käyttäjän määrittelemät toiminnot ovat tyhjentäviä resursseja, meidän on vältettävä näitä toimintoja. Toinen vaihtoehto on sisäänrakennettu ”string_split” -toiminto, mutta tätä toimintoa voidaan käyttää tietokantaan, jonka yhteensopivuustaso on vähintään 130. Joten tässä on toinen ratkaisu tämän vaikean tehtävän ratkaisemiseksi. Merkkijono voidaan jakaa seuraavalla tavalla XML.

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

Tämän kyselyn tulos on:

Jos haluat tarkastella koko XML-tiedostoa. Napsauta linkkiä. Kun olet napsauttanut linkkikoodia, se näyttää tältä.

Nyt XML-merkkijonoa tulisi käsitellä edelleen. Lopuksi käytämme XML-kyselyä "X-Query" -toiminnolla.

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

Tulos on seuraava: