Ako rozdeliť reťazec ohradený znakom na serveri SQL Server?

V tomto článku si ukážeme niekoľko spôsobov rozdelenia hodnoty vymedzeného reťazca. To je možné dosiahnuť pomocou viacerých metód vrátane.

  • Použitie funkcie STRING_SPLIT na rozdelenie reťazca
  • Vytvorte používateľom definovanú funkciu s hodnotou tabuľky na rozdelenie reťazca,
  • Použite XQuery na rozdelenie hodnoty reťazca a transformáciu reťazca s oddeľovačmi na XML

Najskôr musíme vytvoriť tabuľku a vložiť do nej údaje, ktoré sa použijú vo všetkých troch metódach. Tabuľka by mala obsahovať jeden riadok s ID poľa a reťazec so znakmi oddeľovača. Pomocou nasledujúceho kódu vytvorte tabuľku s názvom „študent“.

CREATE TABLE student (ID INT IDENTITY (1, 1), student_name VARCHAR (MAX))

Vložte mená študentov oddelené čiarkami do jedného riadku vykonaním nasledujúceho kódu.

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

Pomocou nasledujúceho kódu overte, či boli do tabuľky vložené údaje alebo nie.

vyberte * od študenta

Metóda 1: Na rozdelenie reťazca použite funkciu STRING_SPLIT

V serveri SQL Server 2016 „STRING_SPLIT“ bola zavedená funkcia, ktorú je možné použiť s úrovňou kompatibility 130 a vyššou. Ak používate verziu SQL Server 2016 alebo vyššiu, môžete použiť túto integrovanú funkciu.

Ďalej „STRING_SPLIT“ zadá reťazec, ktorý má obmedzené podreťazce a jeden znak, ktorý sa použije ako oddeľovač alebo oddeľovač. Funkcia vygeneruje tabuľku s jedným stĺpcom, ktorej riadky obsahujú podreťazce. Názov výstupného stĺpca je „Hodnota “. Táto funkcia má dva parametre. Prvý parameter je reťazec a druhý parameter oddeľovača alebo oddeľovač, na základe ktorého musíme reťazec rozdeliť. Výstup obsahuje tabuľku s jedným stĺpcom, v ktorej sú podreťazce. Tento výstupný stĺpec je pomenovaný „Hodnota“ ako vidíme na obrázku nižšie. Okrem toho „STRING SPLIT“ funkcia table_valued vráti prázdnu tabuľku, ak je vstupný reťazec NULL.

Úroveň kompatibility databázy:

Každá databáza je prepojená s úrovňou kompatibility. Umožňuje kompatibilitu správania databázy s konkrétnou verziou servera SQL Server, na ktorej beží.

Teraz zavoláme funkciu „string_split“ na rozdelenie reťazca oddeleného čiarkami. Úroveň kompatibility však bola nižšia ako 130, preto sa zvýšila nasledujúca chyba. „Neplatný názov objektu„ SPLIT_STRING ““

Preto musíme nastaviť úroveň kompatibility databázy na 130 alebo vyššiu. Podľa tohto kroku teda nastavíme úroveň kompatibility databázy.

  • Najskôr nastavte databázu na „single_user_access_mode“ pomocou nasledujúceho kódu.
ALTER DATABASE SET SINGLE_USER
  • Po druhé, zmeňte úroveň kompatibility databázy pomocou nasledujúceho kódu.
ALTER DATABASE SET COMPATIBILITY_LEVEL = 130
  • Vráťte databázu späť do režimu prístupu viacerých používateľov pomocou nasledujúceho kódu.
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

Výstupom bude:

Teraz spustite tento kód, aby ste dosiahli požadovaný výsledok.

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

Výstup pre tento dopyt bude:

Metóda 2: Ak chcete reťazec rozdeliť, vytvorte používateľom definovanú funkciu tabuľky s hodnotou

Túto tradičnú metódu určite podporujú všetky verzie servera SQL Server. V tejto technike vytvoríme používateľom definovanú funkciu na rozdelenie reťazca oddeľovačom pomocou „PODKLAD”Funkcia,“CHARINDEX”A zatiaľ čo slučka. Túto funkciu je možné použiť na pridanie údajov do výstupnej tabuľky, pretože jej návratový typ je „tabuľka“.

CREATE FUNCTION [dbo]. [Split_string] (@string_value NVARCHAR (MAX), @delimiter_character CHAR (1)) RETURNS @result_set TABLE (splited_data NVARCHAR (MAX)) BEGIN DECLARE @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) ( @string_value, @start_position, @ending_position - @start_position)) SET @start_position = @ending_position + 1 SET @ending_position = CHARINDEX (@delimiter_character, @string_value, @start_position) KONIEC NÁVRAT KONIEC

Teraz vykonajte nasledujúci skript, aby ste zavolali funkciu split na rozdelenie reťazca podľa oddeľovača.

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

Výsledná sada bude taká.

Metóda 3: Použite XQuery na rozdelenie hodnoty reťazca a transformáciu reťazca s oddeľovačmi na XML

Pretože funkcie definované používateľom sú vyčerpávajúce, musíme sa im vyhnúť. Ďalšou možnosťou je zabudovaná funkcia „string_split“, ale túto funkciu je možné použiť pre databázu, ktorej úroveň kompatibility je 130 alebo vyššia. Prichádza teda ďalšie riešenie riešenia tejto náročnej úlohy. Reťazec je možné rozdeliť pomocou nasledujúceho postupu 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 (('' + Nahradiť ( @string_value, @delimiter_value, '') + '') AS XML) SELECT @xml_value

Výstup pre tento dopyt bude:

Ak chcete zobraziť celý súbor XML. Kliknite na odkaz. Po kliknutí bude odkaz vyzerať takto.

Teraz by sa mal reťazec XML ďalej spracovať. Nakoniec použijeme „x-Query“ na dopytovanie z 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 (('' + Nahradiť ( @string_value, @delimiter_value, '') + '') AS XML) VYBERTE xmquery ('.'). value ('.', 'VARCHAR (15)') AKO HODNOTU Z @ xml_value.nodes ('/ studentname') ) AS x (m) 

Výstup bude taký: