Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать функцию для конкатенации столбца в строку? / 18 сообщений из 18, страница 1 из 1
25.12.2014, 13:33
    #38842777
Хобби
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
Нужно возвращать помимо обычных данных строку представляющую собой перечисления через запятую единственной колонки некоторого подзапроса. Пример:

АвторПроизведениеПушкинСказкиПушкинПовестиКипеловРеки ВремёнКипеловЯ свободенКипеловВавилонКипеловПророк
АвторРезультат функции, одна строкаПушкинСказки, ПовестиКипеловРеки Времён, Я свободен, Вавилон, Пророк
Как некоторую фиксированную сделать - знаю. Захотелось универсальную создать.
Сперва была мысль передавать в функцию таблицу, точнее результат подзапроса типа (SELECT col FROM tbl), но кажется как я почитал нельзя передавать параметром таблицу.
Тогда появилась идея использовать EXEC('') или EXEC sp_executesql '', но ета гадина снова не позволяет:
авторInvalid use of a side-effecting operator 'EXECUTE STRING' within a function.авторOnly functions and some extended stored procedures can be executed from within a function.

Подскажите как быть? :С
...
Рейтинг: 0 / 0
25.12.2014, 13:36
    #38842782
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
Хобби,

1) xml
2) рекурсия
...
Рейтинг: 0 / 0
25.12.2014, 13:39
    #38842791
Guest123456
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
...
Рейтинг: 0 / 0
25.12.2014, 14:45
    #38842912
Хобби
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
StarikNavy, можно подрбнее? Что мне гуглить-то?

Guest123456, как раз первый запрос там это-то то что "фиксированную я знаю", я хочу чтоб оно не зависело от таблицы, более гибко.
Для новых версий что-то странное, оно кроссплатформеннное?

Представляю себе или так:
Код: sql
1.
2.
3.
SELECT t.id, t.desc, z.type, t.val,
	dbo.MyFunc(SELECT h.name FROM h WHERE h.t_id=t.id AND h.type=z.type)
FROM t LEFT JOIN z ON(t.id=z.t_id)


или так:
Код: sql
1.
2.
3.
SELECT t.id, t.desc, z.type, t.val,
	dbo.MyFunc('h', 'name', 't_id='+CAST(t.id AS varchar)+' AND type='+CAST(z.type AS varchar))
FROM t LEFT JOIN z ON(t.id=z.t_id)



Итак, передавать параметром функции таблицу/запрос нельзя никак? А EXEC как-то можно заставить работать?
...
Рейтинг: 0 / 0
25.12.2014, 15:25
    #38842978
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
Зачем функция, а?
Так работает?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT DISTINCT T.Автор, L.Список
FROM T
OUTER APPLY
(
 SELECT
  STUFF
  (
   (
    SELECT ', '+TT.Произведение
    FROM T TT
    WHERE TT.Автор=T.Автор
    FOR XML PATH('').TYPE
   ).value('.','varchar(8000)')
  ,1,2,''
  )
) L(Список);

Если уж так хочется, то содержимое подзапроса APPLY можно оформить в виде табличной инлайн функции.

Да, а табличную переменную уже давно можно передать параметром в процедуру или функцию.
...
Рейтинг: 0 / 0
25.12.2014, 15:36
    #38842996
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
Хоббино ета гадина снова не позволяет:В функции ничего универсального написать не получится.
...
Рейтинг: 0 / 0
25.12.2014, 18:04
    #38843224
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
я хочу чтоб оно не зависело от таблицы, более гибко
Универсальное никогда не работает быстро, качественно и не является легким в сопровождении.
...
Рейтинг: 0 / 0
26.12.2014, 09:27
    #38843517
Valer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
можно через CTE, но склеивать символьные поля это не задача SQL,
а приложения которое его использует ( т.е. следующего уровня визуализация и т.п.) .
Прошу отметить , что запрос не формирует новой информации,
в отличии от агрегатных функций min(), sum() и т.п.
Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
 declare  @stroka table( id int ,name varchar(512) ) 
insert into @stroka ( id, name  )	values( 1, 'Сказки' )
insert into @stroka ( id, name)    values( 1, 'Повести' )
insert into @stroka ( id, name)	values( 1, 'Онегин' )
insert into @stroka ( id, name)   values( 1, 'Капитанская дочка' )
insert into @stroka ( id, name)	values( 1, 'Онегин1' )
insert into @stroka ( id, name)	values( 1, 'Капитанская дочка2' )
insert into @stroka ( id, name)	values( 2, 'Реки Времён' )
insert into @stroka ( id, name)	values( 2, 'Я свободен' )
insert into @stroka ( id, name)	values( 2, 'Реки Времён2' )
insert into @stroka ( id, name)	values( 2, 'Я свободен2' )
insert into @stroka ( id, name)	values( 2, 'Я свободен3' )
insert into @stroka ( id, name)	values( 3, 'Пророк' )
insert into @stroka ( id, name)	values( 3, 'Мцыри' )
insert into @stroka ( id, name)	values( 3, 'Маскарад' )
;
with  spisok_npp as (
select id,name,
row_number() over ( partition by  id order by  name) as npp
 from @stroka 
  ),
 spisok as ( 
   select id
   ,name  
   ,npp  
   from spisok_npp  where npp =1	 
 union all 
 select  s.id, convert( varchar(512), s1.name + ', ' + s.name  ),  s.npp
    from  spisok_npp s 
	inner join spisok  s1	
       on s.npp = s1.npp + 1 
	   	  and s.id = s1.id
  ) ,
maxim as (
select id, max(npp) as npp
 from spisok    
  group by id 
 )   --- результат:
 select m.id , s.name from  maxim m
  inner join spisok s
  on s.id = m.id
    and s.npp = m.npp
  order by m.id
...
Рейтинг: 0 / 0
26.12.2014, 09:49
    #38843531
LexusR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
напишите CLR User-Defined Aggregates
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_2devguide/html/5a188b50-7170-4069-acad-5de5c915f65d.htm
...
Рейтинг: 0 / 0
26.12.2014, 09:55
    #38843538
LexusR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
...
Рейтинг: 0 / 0
26.12.2014, 16:21
    #38843980
Как сделать функцию для конкатенации столбца в строку?
Хобби,
можно так:
Код: 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.
33.
34.
declare @ss table(
	  id int
	, name varchar(512)
);

insert into @ss( id, name) 
values( 1, 'Сказки')
	, ( 1, 'Повести' )
	, ( 1, 'Онегин' )
	, ( 1, 'Капитанская дочка' )
	, ( 1, 'Онегин1' )
	, ( 1, 'Капитанская дочка2' )
	, ( 2, 'Реки Времён' )
	, ( 2, 'Я свободен' )
	, ( 2, 'Реки Времён2' )
	, ( 2, 'Я свободен2' )
	, ( 2, 'Я свободен3' )
	, ( 3, 'Пророк' )
	, ( 3, 'Мцыри' )
	, ( 3, 'Маскарад' );

select 
	  s.id
	, MIN(s.name)
	+ ( select ', ' + name
		from @ss t
		where 
			id = s.id
			and name <> MIN(s.name)
		order by name
		for xml path('')
	  )
from @ss s
group by s.id;
...
Рейтинг: 0 / 0
26.02.2015, 23:17
    #38890063
Mike_za
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
Clr агрегаты. Но для 2005 максимальный размер склейки будет 8000 байт.
Самое быстрое, как я понимаю - это через xml? Но там за раз все строки таблицы клеются
...
Рейтинг: 0 / 0
27.02.2015, 11:22
    #38890349
Jaffar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
Mike_za,

for xml path('') - это то что нужно.
все остальное это позапрошлый век.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
27.05.2020, 07:35
    #39962645
iivvvii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
А как тогда вывtсти в одну строку все из таблицы ?
...
Рейтинг: 0 / 0
27.05.2020, 07:46
    #39962646
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
iivvvii
А как тогда вывtсти в одну строку все из таблицы ?


Код: sql
1.
select * from [таблица] for xml auto;
...
Рейтинг: 0 / 0
27.05.2020, 07:49
    #39962647
iivvvii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
Разобрался
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
	
	 ( select '  ' + [Имя] + '  ' + CAST([Количество] AS NVARCHAR(10))
		from dbo.TEST 
		
		for xml path('')
	  ) as Результат_конкатинации_всех_строк_таблицы
...
Рейтинг: 0 / 0
27.05.2020, 08:08
    #39962655
iivvvii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
	
	 ( select '  ' + [Имя] + '  ' + CAST([Количество] AS NVARCHAR(10))
		from dbo.TEST 
		
		for xml path('')
	  ) as Результат_конкатинации_всех_строк_таблицы



Наверно все же так в вашем случае получается XML файл
...
Рейтинг: 0 / 0
27.05.2020, 13:17
    #39962776
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать функцию для конкатенации столбца в строку?
iivvvii
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
	
	 ( select '  ' + [Имя] + '  ' + CAST([Количество] AS NVARCHAR(10))
		from dbo.TEST 
		
		for xml path('')
	  ) as Результат_конкатинации_всех_строк_таблицы



Наверно все же так в вашем случае получается XML файл


Только это "не фсе" и уже "не таблица".
Хе-хе.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать функцию для конкатенации столбца в строку? / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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