powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Существует ли обратная функция STRING_SPLIT
22 сообщений из 22, страница 1 из 1
Существует ли обратная функция STRING_SPLIT
    #39849621
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день

Смотрю новые возможности MSSQL2016... появилась удобная функция STRING_SPLIT, которая переводит строковое значение в табличный вариант...

собственно вопрос, а есть что-то "обратное" т.е. функция, которая табличный вариант переведёт в строку с нужным разделителем?
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849625
Нет. Самое лучшее что есть это FOR XML PATH
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849634
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно подойдёт: STRING_AGG
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849636
1C Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то вроде этого?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT I.table_name, LEFT(T.column_names , LEN(T.column_names )-1) AS column_names
FROM information_schema.columns AS I
CROSS APPLY
(
    SELECT column_name + ','
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH('')
) T (column_names)
GROUP BY I.table_name, T.column_names;
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849639
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4d_monsterВозможно подойдёт: STRING_AGG
Это с 2017+
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849643
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4d_monsterВозможно подойдёт: STRING_AGG

Да... то что надо)) но вот только не под mssql2016
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849645
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1C DeveloperЧто-то вроде этого?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT I.table_name, LEFT(T.column_names , LEN(T.column_names )-1) AS column_names
FROM information_schema.columns AS I
CROSS APPLY
(
    SELECT column_name + ','
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH('')
) T (column_names)
GROUP BY I.table_name, T.column_names;



Получается по старинке)) минус в постоянном использовании что-то типа "LEFT(T.column_names , LEN(T.column_names )-1)" ((
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849676
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSминус в постоянном использовании что-то типа "LEFT(T.column_names , LEN(T.column_names )-1)" ((
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT I.table_name, T.column_names AS column_names
FROM information_schema.columns AS I
CROSS APPLY
(
    SELECT case when row_number() over (order by 1/0) = 1 then '' else ', ' end + column_name
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH('')
) T (column_names)
GROUP BY I.table_name, T.column_names;
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849716
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT I.table_name, T.column_names AS column_names
FROM information_schema.columns AS I
CROSS APPLY
(
    SELECT case when row_number() over (order by 1/0) = 1 then '' else ', ' end + column_name
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH('')
) T (column_names)
GROUP BY I.table_name, T.column_names;

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT I.table_name, STUFF(T.column_names,1,2,'') AS column_names
FROM information_schema.columns AS I
CROSS APPLY
(
    SELECT ', ' + column_name
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH('')
) T (column_names)
GROUP BY I.table_name, T.column_names;
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849717
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более правильно, однако, так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT I.table_name, STUFF(T.column_names,1,2,'') AS column_names
FROM information_schema.columns AS I
CROSS APPLY
(
    SELECT ', ' + QUOTENAME(column_name)
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH('')
) T (column_names)
GROUP BY I.table_name, T.column_names;
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849752
Валдай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще вариант для строк, в которых есть спецсимволы

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
if object_id('dbo.badcolumns','U') is not null drop table dbo.[badcolumns]
go
create table dbo.[badcolumns] (
  id int,
  [тут&что-то>странное] varchar(max)
)
go
SELECT I.table_name, T.column_names AS column_names
FROM information_schema.tables AS I
CROSS APPLY
( SELECT 
    STUFF( 
    ( SELECT [text()] = cast( ',' + column_name as varchar(max))
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH(''), TYPE ).value('.','varchar(max)'),1,1,'')
) T (column_names)
WHERE i.table_name = 'badcolumns'

--GROUP BY I.table_name, T.column_names;

SELECT I.table_name, LEFT(T.column_names , LEN(T.column_names )-1) AS column_names
FROM information_schema.columns AS I
CROSS APPLY
(
    SELECT column_name + ','
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH('')
) T (column_names)
WHERE i.table_name = 'badcolumns'
GROUP BY I.table_name, T.column_names;
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849763
Александр Бердышев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1C DeveloperЧто-то вроде этого?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT I.table_name, LEFT(T.column_names , LEN(T.column_names )-1) AS column_names
FROM information_schema.columns AS I
CROSS APPLY
(
    SELECT column_name + ','
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH('')
) T (column_names)
GROUP BY I.table_name, T.column_names;



Прикольно: первый раз с подобной проблемой столкнулся 7 лет назад - а подход до сих пор прежний...
Хорошо что хоть с 2017 версии сделали по-человечески.

Главное не делайте это отдельной функцией с курсором/циклом.
При запуске такой функции на таблице производительность упадёт примерно на 2 порядка.
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39849859
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

поищите CLR функции от Adam Machanic, работают быстрее SQL новодела.
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39850198
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Бердышев1C DeveloperЧто-то вроде этого?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT I.table_name, LEFT(T.column_names , LEN(T.column_names )-1) AS column_names
FROM information_schema.columns AS I
CROSS APPLY
(
    SELECT column_name + ','
    FROM information_schema.columns AS intern
    WHERE I.table_name = intern.table_name
    FOR XML PATH('')
) T (column_names)
GROUP BY I.table_name, T.column_names;



Прикольно: первый раз с подобной проблемой столкнулся 7 лет назад - а подход до сих пор прежний...
Хорошо что хоть с 2017 версии сделали по-человечески.

Главное не делайте это отдельной функцией с курсором/циклом.
При запуске такой функции на таблице производительность упадёт примерно на 2 порядка.

т.е. производительность упадёт в 20 раз?
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39850264
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинАлександр Бердышевпропущено...


Прикольно: первый раз с подобной проблемой столкнулся 7 лет назад - а подход до сих пор прежний...
Хорошо что хоть с 2017 версии сделали по-человечески.

Главное не делайте это отдельной функцией с курсором/циклом.
При запуске такой функции на таблице производительность упадёт примерно на 2 порядка.

т.е. производительность упадёт в 20 раз?Два порядка - это в сто раз! :))
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39850491
лолл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы, Microsoft не смогли удачно реализовать STRING_AGG и STRING_SPLIT...
1. Оба не поддерживают в качестве разделителя строку (только один символ!).
2. Нет оконной STRING_AGG.
3. STRING_AGG не поддерживает DISTINCT и ее результат ограничен 8к символами.
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39850503
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лоллУвы, Microsoft не смогли удачно реализовать STRING_AGG и STRING_SPLIT...
1. Оба не поддерживают в качестве разделителя строку (только один символ!).
2. Нет оконной STRING_AGG.
3. STRING_AGG не поддерживает DISTINCT и ее результат ограничен 8к символами.

из ваших "увы", полностью верный только 2-й


1.

Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
	string_agg(x.a, ' $separate string$ ')
from (
	values 
	  ('1')
	  , ('2')
) x (a)





3.

string-agg

Типы возвращаемых данных
Тип возвращаемого значения зависит от первого аргумента (expression). Если входной аргумент имеет строковый тип (NVARCHAR, VARCHAR), результат будет иметь тот же тип. В приведенной ниже таблице перечислены автоматические преобразования.
Тип входного выраженияРезультатNVARCHAR(MAX)NVARCHAR(MAX)VARCHAR(MAX)VARCHAR(MAX)NVARCHAR(1...4000)NVARCHAR(4000)VARCHAR(1...8000)VARCHAR(8000)int, bigint, smallint, tinyint, numeric, float, real, bit, decimal, smallmoney, money, datetime, datetime2,NVARCHAR(4000)
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39852193
лолл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
	string_agg(distinct x.a, ' $separate string$ ')
from (
	values 
	  ('1')
	  , ('2')
) x (a)


SELECT *
FROM STRING_SPLIT('1 $separate string$ 2', ' $separate string$ ')
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39852228
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лоллmsLex,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
	string_agg(distinct x.a, ' $separate string$ ')
from (
	values 
	  ('1')
	  , ('2')
) x (a)


SELECT *
FROM STRING_SPLIT('1 $separate string$ 2', ' $separate string$ ')




Читаем ваше утверждение

лолл1. Оба не поддерживают в качестве разделителя строку (только один символ!).

Читаем мой комментарий

автор полностью верный только 2-й

думаем
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39852335
лолл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

Это имеет значение, если придираться к точности формулировок. Я смотрю на вопрос иначе: есть то, что мне не нравится в реализации этих функций, я это озвучил (спасибо за устранение неточностей, которые были допущены при ответе на скорую руку).
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39852363
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лоллmsLex,

Это имеет значение, если придираться к точности формулировок. Я смотрю на вопрос иначе: есть то, что мне не нравится в реализации этих функций, я это озвучил (спасибо за устранение неточностей, которые были допущены при ответе на скорую руку).

Ровно половина описанных вами неудобств отсутвует. И чтобы узнать это, достаточно открыть справку. Это не неточности, это просто незнание. Как вы можете оценивать удобство этих функции, если не разобрались даже с требуемым вам функционалом?
...
Рейтинг: 0 / 0
Существует ли обратная функция STRING_SPLIT
    #39852534
лолл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

Так оставьте ту половину неудобств, что присутствует, в чем проблема? Их достаточно, чтобы в некоторых случаях использовать альтернативные пути решения.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Существует ли обратная функция STRING_SPLIT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]