В этой статье мы обсудим несколько способов разделения строкового значения с разделителями. Это может быть достигнуто с использованием нескольких методов, включая.
- Использование функции STRING_SPLIT для разделения строки
- Создание определяемой пользователем функции с табличным значением для разделите строку,
- Используйте XQuery для разделения строкового значения и преобразования строки с разделителями в XML
Прежде всего, нам нужно создать таблицу и вставьте в него данные, которые будут использоваться во всех трех методах. Таблица должна содержать одну строку с идентификатором поля и строку с символами-разделителями в ней. Создайте таблицу с именем «student», используя следующий код.
СОЗДАТЬ ТАБЛИЦУ student (ID INT IDENTITY (1, 1 ), Student_name VARCHAR (MAX))
Вставьте имена студентов, разделенные запятыми, в одну строку, выполнив следующий код.
INSERT INTO student (student_name) VALUES ( 'Монрой, Монтанез, Маролахакис, Негли, Олбрайт, Гарофоло, Перейра, Джонсон, Вагнер, Конрад')
Убедитесь, что данные были вставлены в таблицу или нет, используя следующий код.
select * from student
Метод 1. Используйте функцию STRING_SPLIT для разделения строки
В SQL Server 2016 « STRING_SPLIT », которая может использоваться с уровнем совместимости 130 и выше. Если вы используете версию SQL Server 2016 или выше, вы можете использовать эту встроенную функцию.
Кроме того, «STRING_SPLIT» вводит строку с разделенными подстроками. и вводит один символ для использования в качестве разделителя или разделителя. Функция выводит таблицу с одним столбцом, строки которой содержат подстроки. Имя выходного столбца – « Значение» . Эта функция получает два параметра. Первый параметр – это строка, а второй – символ-разделитель или разделитель, на основе которого мы должны разделить строку. Выходные данные содержат таблицу с одним столбцом, в которой присутствуют подстроки. Этот выходной столбец называется «Значение» , как видно на рисунке ниже. Более того, функция «STRING SPLIT» table_valued возвращает пустую таблицу, если входная строка имеет значение NULL.
Уровень совместимости базы данных:
Каждая база данных связана с уровнем совместимости. Это обеспечивает совместимость поведения базы данных с конкретной версией SQL Server, на которой она работает.
Теперь мы вызовем функцию «string_split» для разделения строки, разделенной запятыми. Но уровень совместимости был меньше 130, поэтому возникла следующая ошибка. «Недопустимое имя объекта ‘SPLIT_STRING’»
Таким образом, нам нужно установить уровень совместимости базы данных на 130 или выше. Итак, мы будем следовать этому шагу, чтобы установить уровень совместимости базы данных..
- Прежде всего установите базу данных в «single_user_access_mode», используя следующий код.
ALTER DATABASE SET SINGLE_USER
- Во-вторых, измените уровень совместимости базы данных с помощью следующего кода.
ALTER DATABASE SET COMPATIBILITY_LEVEL = 130
- Верните базу данных в режим многопользовательского доступа, используя следующий код.
ALTER DATABASE SET MULTI_USER
USE [master] GOALTER DATABASE [bridge_centrality] SET SINGLE_USERALTER DATABASE [bridge_centrality] SET COMPATIBILITY_LEVEL = 130ALTER DATABASE [bridge_centrality] SET MULTI_USERGO
вывод будет следующим:
Теперь запустите этот код, чтобы получить требуемый результат.
DECLARE @string_value VARCHAR (MAX); SET @ string_value = 'Монрой, Монтанез, Маролахакис, Негли , Олбрайт, Гарофоло, Перейра, Джонсо n, Вагнер, Конрад'SELECT * FROM STRING_SPLIT (@string_value, ',')
Результатом этого запроса будет:
Метод 2: Чтобы разделить строку, создайте определяемую пользователем функцию с табличным значением
Конечно , этот традиционный метод поддерживается всеми версиями SQL Server. В этом методе мы создадим определяемую пользователем функцию для разделения строки по символу-разделителю, используя функцию « SUBSTRING », « CHARINDEX » и цикл while. Эту функцию можно использовать для добавления данных в выходную таблицу, поскольку ее тип возвращаемого значения – «таблица».
CREATE FUNCTION [dbo]. [Split_string] (@string_value NVARCHAR (MAX), @delimiter_character CHAR (1)) ВОЗВРАТ @result_set ТАБЛИЦА (разделенные_данные NVARCHAR (МАКС)) НАЧАТЬ ОБЪЯВЛЕНИЕ @start_position INT, @ending_position INT SELECT @start_position = 1, @ending_position = CHARINDEX (@delimiter_character, @string_value) WHILEТеперь выполните сценарий ниже, чтобы вызвать функцию разделения для разделения строки по символу-разделителю.
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)Набор результатов будет таким.
Метод 3: Используйте XQuery для разделения строкового значения и преобразования строки с разделителями в XML
Поскольку пользовательские функции являются ресурсами исчерпывающий, поэтому мы должны избегать этих функций. Другой вариант - встроенная функция «string_split», но эту функцию можно использовать для базы данных, для которой уровень совместимости составляет 130 или выше. Итак, вот еще одно решение для решения этой сложной задачи. Строка может быть разделены с использованием следующего XML .
DECLARE @xml_value AS XML, @string_value AS VARCHAR (2000), @delimiter_value AS VARCHAR (15) SET @ string_value = ( ВЫБРАТЬ имя студента ОТ студента) SET @delimiter_value = ',' SET @xml_value = Cast (('' + Replace (@string_value, @delimiter_value, ' ') + '' ) AS XML) SELECT @xml_valueРезультатом этого запроса будет:
Если вы хотите просмотреть все XML-файл. Щелкните ссылку. После того, как вы нажмете, код ссылки будет выглядеть следующим образом.
Теперь строка XML должна быть обработана дальше. Наконец, мы будем использовать «x-Query» для запроса из XML.
DECLARE @xml_value AS XML, @string_value AS VARCHAR (2000), @delimiter_value AS VARCHAR (15) SET @ string_value = (ВЫБЕРИТЕ имя студента ОТ студента) SET @delimiter_value = ',' SET @xml_value = Cast (('' + Replace (@string_value, @delimiter_value, ' ') + ' ') AS XML) SELECT xmquery ('. '). Value ('. ',' VARCHAR (15) ') AS VALUEFROM @ xml_value.nodes ('/studentname ') AS x (m)Результат будет таким: