- STRING_SPLIT в SQL Server 2012
- 8 ответов
- STRING_SPLIT (Transact-SQL)
- Уровень совместимости 130
- Синтаксис
- Аргументы
- Типы возвращаемых данных
- Remarks
- Примеры
- A. Разделение строки значений с разделителями-запятыми
- Б. Разделение строки значений с разделителями-запятыми в столбце
- В. Объединение по значениям
- Г. Поиск по значению тега
- Д. Поиск строк по списку значений
- T-SQL split string
- 27 Answers 27
- STRING_SPLIT (Transact-SQL)
- Compatibility level 130
- Syntax
- Arguments
- Return Types
- Remarks
- Examples
- A. Split comma-separated value string
- B. Split comma-separated value string in a column
- C. Aggregation by values
- D. Search by tag value
- E. Find rows by list of values
STRING_SPLIT в SQL Server 2012
У меня есть этот параметр
Я хочу сделать что-то, чтобы разделить значения через запятую.
Функция string_split не работает, и я получаю эту ошибку:
Функция STRING_SPLIT доступна только при уровне совместимости 130
И я пытаюсь изменить свою базу данных и установить совместимость 130, но у меня нет разрешения на это изменение.
8 ответов
Другой подход — использовать XML метод с CROSS APPLY для разделения данных, разделенных запятыми:
Вы можете попробовать эту функцию
Я сделал это как быструю и грязную замену, используя табличный подход, чтобы конечный пользователь мог выбрать, какой из разделов он хочет. Исходная строка может использоваться в соединении или в отдельной строке, выбранной для скалярного результата. Проверено в
Microsoft SQL Server 2012 (SP4-OD) (KB4091266) — 11.0.7469.6 (X64) 28 февраля 2018 г. 17:47:20 Авторские права (c) Выпуск Microsoft Corporation Enterprise (64-разрядный) для Windows NT 6.3 (сборка 9600:) ( гипервизор )
SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON; ИДТИ
Создать ФУНКЦИЮ dbo.StringSplit2012 (@OriginalString VARCHAR (500), @ Separator VARCHAR (6)) ВОЗВРАЩАЕТСЯ @Sections TABLE (OriginalString VARCHAR (500) NOT NULL, StringSection VARCHAR (500) NULL, SectionNumber INT) BEGIN DEGIN;
Надеюсь, это сэкономит кому-то время. Я использую STRING_SPLIT в функции, которую я создал, чтобы дать мне имя пакета из команды шага задания, и оно лопнуло, когда я перешел на свой сервер 2012 года. Поэтому я написал свой. (Как ты!)
BI / Integrations Developer III
Aspen Dental Management, Inc
Если уровень совместимости вашей базы данных ниже 130 , SQL Server не сможет найти и выполнить функцию STRING_SPLIT . Вы можете изменить уровень совместимости базы данных, используя следующую команду:
Обратите внимание, что уровень совместимости 120 может быть по умолчанию даже в новых базах данных SQL Azure.
Версия — самый высокий уровень совместимости — самый низкий доступный уровень
SQL 2017 — 140 — 100
SQL 2016 — 130 — 100
SQL 2014 — 120 — 100
SQL 2012 — 110 — 90
SQL 2008 — 100 — 80
SQL 2005 — 90 — 80
SQL 2000 — 80 — 80
Также проверьте ваш синтаксис, например:
Для тех, кто ищет, как преобразовать многострочный текст в строки, вот код, основанный на ответе:
Небольшая вариация полизаполнения @ Al3x_M, когда невозможно изменить уровень совместимости базы данных: я использую переменную TABLE для хранения списка значений, чтобы использовать их позже в другом запросе:
Другой подход заключается в использовании CHARINDEX и SUBSTRING в WHILE:
Встроенная функция на основе Йогеш Шарма и Салман А отвечает:
Источник
STRING_SPLIT (Transact-SQL)
Применимо к: SQL Server 2016 (13.x); и более поздние версии База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics
Функция с табличным значением, которая разбивает строку на строки подстрок в зависимости от указанного знака разделения.
Уровень совместимости 130
STRING_SPLIT требует уровня совместимости не ниже 130. При уровне меньше 130 SQL Server не может найти функцию STRING_SPLIT.
Сведения об изменении уровня совместимости базы данных см. в статье Просмотр или изменение уровня совместимости базы данных.
Конфигурация совместимости для STRING_SPLIT в Azure Synapse Analytics не требуется.
Синтаксические обозначения в Transact-SQL
Синтаксис
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
строка
Выражение любого символьного типа (например, nvarchar, varchar, nchar или char).
separator язательно, количество
Отдельное выражение любого символьного типа (например, nvarchar(1) , varchar(1) , nchar(1) или char(1) ), которое используется в качестве разделителя сцепленных подстрок.
Типы возвращаемых данных
Возвращает состоящую из одного столбца таблицу, строки которой являются подстроками. Имя столбца — value. Возвращает значение типа nvarchar, если любой из входных аргументов имеет тип nvarchar или nchar. В противном случае возвращает значение типа varchar. Длина типа возвращаемого значения равна длине аргумента string.
Remarks
STRING_SPLIT вводит строку с разделенными подстроками и один символ для использования в качестве разделителя. STRING_SPLIT выводит таблицу с одним столбцом, строки которого содержат подстроки. Имя выходного столбца — value.
Выходные строки могут быть расположены в любом порядке. Порядок не обязательно совпадает с порядком подстрок во входной строке. Окончательный порядок сортировки можно переопределить с помощью предложения ORDER BY в инструкции SELECT ( ORDER BY value ).
Символ 0x0000 (char(0) ) не определен в параметрах сортировки Windows, и его нельзя включать в STRING_SPLIT.
Пустые строки нулевой длины присутствуют в том случае, если входная строка содержит два или несколько последовательных вхождений знака разделителя. Пустые подстроки обрабатываются так же, как и обычные подстроки. Можно отфильтровать строки, содержащие пустые подстроки, используя предложение WHERE ( WHERE value <> » ). Если входная строка равна NULL, функция STRING_SPLIT с табличным значением возвращает пустую таблицу.
Например, следующая инструкция SELECT использует символ пробела в качестве разделителя:
В пробном запуске предыдущая инструкция SELECT вернула следующую результирующую таблицу:
value |
---|
Lorem |
ipsum |
dolor |
sit |
amet. |
Примеры
A. Разделение строки значений с разделителями-запятыми
Следующая инструкция анализирует разделенный запятыми список значений и возвращает все непустые токены:
Функция STRING_SPLIT вернет пустую строку, если между разделителями ничего нет. Condition RTRIM(value) <> » удаляет пустые токены.
Б. Разделение строки значений с разделителями-запятыми в столбце
Таблица Product содержит столбец с разделенным запятыми списком тегов, как показано в следующем примере:
ProductId | Имя | Теги |
---|---|---|
1 | Full-Finger Gloves | clothing,road,touring,bike |
2 | LL Headset | bike |
3 | HL Mountain Frame | bike,mountain |
Следующий запрос преобразовывает каждый список тегов и соединяет его с исходной строкой:
ProductId | Имя | value |
---|---|---|
1 | Full-Finger Gloves | clothing |
1 | Full-Finger Gloves | road |
1 | Full-Finger Gloves | touring |
1 | Full-Finger Gloves | bike |
2 | LL Headset | bike |
3 | HL Mountain Frame | bike |
3 | HL Mountain Frame | mountain |
Порядок вывода может меняться и не обязательно совпадает с порядком подстрок во входной строке.
В. Объединение по значениям
Пользователю необходимо создать отчет, в котором приводится число продуктов по каждому тегу, причем теги упорядочены по числу продуктов, и отфильтрованы теги с более чем двумя продуктами.
Г. Поиск по значению тега
Разработчикам необходимо создать запросы для поиска статей по ключевым словам. Они могут использовать представленные ниже запросы.
Поиск продуктов с одним тегом (clothing):
Поиск продуктов с двумя тегами (clothing и road):
Д. Поиск строк по списку значений
Разработчикам необходимо создать запрос, который находит статьи по списку идентификаторов. Они могут использовать следующий запрос:
Предыдущее использование STRING_SPLIT является заменой распространенного антишаблона. Такой антишаблон может включать создание динамической строки SQL на прикладном уровне или в Transact-SQL. Или антишаблон может осуществляться с помощью оператора LIKE. Смотрите следующий пример инструкции SELECT.
Источник
T-SQL split string
I have a SQL Server 2008 R2 column containing a string which I need to split by a comma. I have seen many answers on StackOverflow but none of them works in R2. I have made sure I have select permissions on any split function examples. Any help greatly appreciated.
27 Answers 27
I’ve used this SQL before which may work for you:-
Instead of recursive CTEs and while loops, has anyone considered a more set-based approach? Note that this function was written for the question, which was based on SQL Server 2008 and comma as the delimiter. In SQL Server 2016 and above (and in compatibility level 130 and above), STRING_SPLIT() is a better option.
If you want to avoid the limitation of the length of the string being sys.all_columns (9,980 in model in SQL Server 2017; much higher in your own user databases), you can use other approaches for deriving the numbers, such as building your own table of numbers. You could also use a recursive CTE in cases where you can’t use system tables or create your own:
But you’ll have to append OPTION (MAXRECURSION 0) (or MAXRECURSION ) to the outer query in order to avoid errors with recursion for strings > 100 characters. If that is also not a good alternative then see this answer as pointed out in the comments.
(Also, the delimiter will have to be NCHAR( . Still researching why.)
More on split functions, why (and proof that) while loops and recursive CTEs don’t scale, and better alternatives, if splitting strings coming from the application layer:
Источник
STRING_SPLIT (Transact-SQL)
Applies to: SQL Server 2016 (13.x) and later Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics
A table-valued function that splits a string into rows of substrings, based on a specified separator character.
Compatibility level 130
STRING_SPLIT requires the compatibility level to be at least 130. When the level is less than 130, SQL Server is unable to find the STRING_SPLIT function.
To change the compatibility level of a database, refer to View or Change the Compatibility Level of a Database.
Compatibility configuration is not needed for STRING_SPLIT in Azure Synapse Analytics.
Transact-SQL Syntax Conventions
Syntax
To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.
Arguments
string
Is an expression of any character type (for example, nvarchar, varchar, nchar, or char).
separator
Is a single character expression of any character type (for example, nvarchar(1), varchar(1), nchar(1), or char(1)) that is used as separator for concatenated substrings.
Return Types
Returns a single-column table whose rows are the substrings. The name of the column is value. Returns nvarchar if any of the input arguments are either nvarchar or nchar. Otherwise returns varchar. The length of the return type is the same as the length of the string argument.
Remarks
STRING_SPLIT inputs a string that has delimited substrings, and inputs one character to use as the delimiter or separator. STRING_SPLIT outputs a single-column table whose rows contain the substrings. The name of the output column is value.
The output rows might be in any order. The order is not guaranteed to match the order of the substrings in the input string. You can override the final sort order by using an ORDER BY clause on the SELECT statement ( ORDER BY value ).
0x0000 (char(0)) is an undefined character in Windows collations and cannot be included in STRING_SPLIT.
Empty zero-length substrings are present when the input string contains two or more consecutive occurrences of the delimiter character. Empty substrings are treated the same as are plain substrings. You can filter out any rows that contain the empty substring by using the WHERE clause ( WHERE value <> » ). If the input string is NULL, the STRING_SPLIT table-valued function returns an empty table.
As an example, the following SELECT statement uses the space character as the separator:
In a practice run, the preceding SELECT returned following result table:
value |
---|
Lorem |
ipsum |
dolor |
sit |
amet. |
В |
Examples
A. Split comma-separated value string
Parse a comma-separated list of values and return all non-empty tokens:
STRING_SPLIT will return empty string if there is nothing between separator. Condition RTRIM(value) <> » will remove empty tokens.
B. Split comma-separated value string in a column
Product table has a column with comma-separate list of tags shown in the following example:
ProductId | Name | Tags |
---|---|---|
1 | Full-Finger Gloves | clothing,road,touring,bike |
2 | LL Headset | bike |
3 | HL Mountain Frame | bike,mountain |
Following query transforms each list of tags and joins them with the original row:
Here is the result set.
ProductId | Name | value |
---|---|---|
1 | Full-Finger Gloves | clothing |
1 | Full-Finger Gloves | road |
1 | Full-Finger Gloves | touring |
1 | Full-Finger Gloves | bike |
2 | LL Headset | bike |
3 | HL Mountain Frame | bike |
3 | HL Mountain Frame | mountain |
The order of the output may vary as the order is not guaranteed to match the order of the substrings in the input string.
C. Aggregation by values
Users must create a report that shows the number of products per each tag, ordered by number of products, and to filter only the tags with more than two products.
D. Search by tag value
Developers must create queries that find articles by keywords. They can use following queries:
To find products with a single tag (clothing):
Find products with two specified tags (clothing and road):
E. Find rows by list of values
Developers must create a query that finds articles by a list of IDs. They can use following query:
The preceding STRING_SPLIT usage is a replacement for a common anti-pattern. Such an anti-pattern can involve the creation of a dynamic SQL string in the application layer or in Transact-SQL. Or an anti-pattern can be achieved by using the LIKE operator. See the following example SELECT statement:
Источник