Jak rozdělit řetězec o oddělený znak na serveru SQL Server?

V tomto článku probereme několik způsobů, jak rozdělit hodnotu oddělovaného řetězce. Toho lze dosáhnout pomocí několika metod včetně.

  • K rozdělení řetězce použijte funkci STRING_SPLIT
  • Vytvořte uživatelsky definovanou funkci s hodnotou tabulky a rozdělte řetězec,
  • Použijte XQuery k rozdělení hodnoty řetězce a transformaci řetězce s oddělovači na XML

Nejprve musíme vytvořit tabulku a vložit do ní data, která budou použita ve všech třech metodách. Tabulka by měla obsahovat jeden řádek s ID pole a řetězec se znaky oddělovače. Vytvořte tabulku s názvem „student“ pomocí následujícího kódu.

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

Vložte jména studentů oddělená čárkami do jednoho řádku provedením následujícího kódu.

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

Pomocí následujícího kódu ověřte, zda byla do tabulky vložena data, či nikoli.

vyberte * od studenta

Metoda 1: K rozdělení řetězce použijte funkci STRING_SPLIT

Na serveru SQL Server 2016 „STRING_SPLIT“ byla zavedena funkce, kterou lze použít s úrovní kompatibility 130 a vyšší. Pokud používáte verzi SQL Server 2016 nebo vyšší, můžete použít tuto integrovanou funkci.

Dále „STRING_SPLIT“ zadá řetězec, který má oddělené podřetězce, a zadá jeden znak, který se použije jako oddělovač nebo oddělovač. Funkce vygeneruje tabulku s jedním sloupcem, jejíž řádky obsahují podřetězce. Název výstupního sloupce je „Hodnota". Tato funkce získá dva parametry. První parametr je řetězec a druhý je oddělovač nebo oddělovač, na základě kterého musíme řetězec rozdělit. Výstup obsahuje tabulku s jedním sloupcem, ve které jsou podřetězce. Tento výstupní sloupec je pojmenován "Hodnota" jak vidíme na obrázku níže. Navíc „STRING SPLIT“ funkce table_valued vrátí prázdnou tabulku, pokud je vstupní řetězec NULL.

Úroveň kompatibility databáze:

Každá databáze je spojena s úrovní kompatibility. Umožňuje kompatibilitu chování databáze s konkrétní verzí serveru SQL Server, na které běží.

Nyní zavoláme funkci „string_split“ k rozdělení řetězce odděleného čárkami. Úroveň kompatibility však byla nižší než 130, a proto byla vyvolána následující chyba. „Neplatný název objektu„ SPLIT_STRING ““

Musíme tedy nastavit úroveň kompatibility databáze na 130 nebo vyšší. Podle tohoto kroku tedy nastavíme úroveň kompatibility databáze.

  • Nejprve nastavte databázi na „single_user_access_mode“ pomocí následujícího kódu.
ALTER DATABASE SET SINGLE_USER
  • Za druhé, změňte úroveň kompatibility databáze pomocí následujícího kódu.
ALTER DATABASE SET COMPATIBILITY_LEVEL = 130
  • Vraťte databázi zpět do režimu přístupu pro více uživatelů pomocí následujícího 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ýstup bude:

Nyní spusťte tento kód, abyste získali požadovaný výsledek.

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 pro tento dotaz bude:

Metoda 2: Chcete-li řetězec rozdělit, vytvořte uživatelem definovanou tabulkovou funkci

Tuto tradiční metodu jistě podporují všechny verze serveru SQL Server. V této technice vytvoříme uživatelem definovanou funkci, která rozdělí řetězec pomocí oddělovače pomocí „SUBSTRING„Funkce,“CHARINDEX“A zatímco smyčka. Tuto funkci lze použít k přidání dat do výstupní tabulky, protože její návratový typ je „tabulka“.

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 = 1 @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) KONEC NÁVRAT KONEC

Nyní spusťte níže uvedený skript a zavoláte funkci split na rozdělení řetězce podle znaku oddělovače.

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 taková.

Metoda 3: Použijte XQuery k rozdělení hodnoty řetězce a transformaci řetězce s oddělovači na XML

Protože funkce definované uživatelem jsou vyčerpávající, musíme se těmto funkcím vyhnout. Další možností je vestavěná funkce „string_split“, ale tuto funkci lze použít pro databázi, pro kterou je úroveň kompatibility 130 nebo vyšší. A tak přichází další řešení, jak vyřešit tento obtížný úkol. Řetězec lze rozdělit pomocí následujícího 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

Výstup pro tento dotaz bude:

Pokud chcete zobrazit celý soubor XML. Klikněte na odkaz. Po kliknutí bude kód odkazu vypadat takto.

Nyní by měl být řetězec XML dále zpracován. Nakonec použijeme „x-Query“ k dotazování 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 (('' + Replace ( @string_value, @delimiter_value, '') + '') AS XML) SELECT xmquery ('.'). value ('.', 'VARCHAR (15)') AS VALUE FROM @ xml_value.nodes ('/ studentname' ) AS x (m) 

Výstup bude takový:


$config[zx-auto] not found$config[zx-overlay] not found