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

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

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

Код: 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
15.08.2019, 11:04
    #39849639
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
4d_monsterВозможно подойдёт: STRING_AGG
Это с 2017+
...
Рейтинг: 0 / 0
15.08.2019, 11:09
    #39849643
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
4d_monsterВозможно подойдёт: STRING_AGG

Да... то что надо)) но вот только не под mssql2016
...
Рейтинг: 0 / 0
15.08.2019, 11:12
    #39849645
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
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
15.08.2019, 11:44
    #39849676
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
Игорь_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
15.08.2019, 12:38
    #39849716
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
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
15.08.2019, 12:41
    #39849717
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
Более правильно, однако, так:
Код: 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
15.08.2019, 13:34
    #39849752
Валдай
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
еще вариант для строк, в которых есть спецсимволы

Код: 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
15.08.2019, 13:47
    #39849763
Александр Бердышев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
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
15.08.2019, 15:33
    #39849859
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
Игорь_UUS,

поищите CLR функции от Adam Machanic, работают быстрее SQL новодела.
...
Рейтинг: 0 / 0
16.08.2019, 10:34
    #39850198
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
Александр Бердышев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
16.08.2019, 11:46
    #39850264
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
Ролг ХупинАлександр Бердышевпропущено...


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

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

т.е. производительность упадёт в 20 раз?Два порядка - это в сто раз! :))
...
Рейтинг: 0 / 0
16.08.2019, 17:03
    #39850491
лолл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
Увы, Microsoft не смогли удачно реализовать STRING_AGG и STRING_SPLIT...
1. Оба не поддерживают в качестве разделителя строку (только один символ!).
2. Нет оконной STRING_AGG.
3. STRING_AGG не поддерживает DISTINCT и ее результат ограничен 8к символами.
...
Рейтинг: 0 / 0
16.08.2019, 17:43
    #39850503
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
лоллУвы, 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
21.08.2019, 15:58
    #39852193
лолл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
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
21.08.2019, 16:32
    #39852228
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
лолл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
21.08.2019, 18:45
    #39852335
лолл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Существует ли обратная функция STRING_SPLIT
msLex,

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

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

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

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


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