powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать функцию для конкатенации столбца в строку?
18 сообщений из 18, страница 1 из 1
Как сделать функцию для конкатенации столбца в строку?
    #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
Как сделать функцию для конкатенации столбца в строку?
    #38842782
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хобби,

1) xml
2) рекурсия
...
Рейтинг: 0 / 0
Как сделать функцию для конкатенации столбца в строку?
    #38842791
Guest123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Как сделать функцию для конкатенации столбца в строку?
    #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
Как сделать функцию для конкатенации столбца в строку?
    #38842978
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
Как сделать функцию для конкатенации столбца в строку?
    #38842996
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хоббино ета гадина снова не позволяет:В функции ничего универсального написать не получится.
...
Рейтинг: 0 / 0
Как сделать функцию для конкатенации столбца в строку?
    #38843224
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я хочу чтоб оно не зависело от таблицы, более гибко
Универсальное никогда не работает быстро, качественно и не является легким в сопровождении.
...
Рейтинг: 0 / 0
Как сделать функцию для конкатенации столбца в строку?
    #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
Как сделать функцию для конкатенации столбца в строку?
    #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
Как сделать функцию для конкатенации столбца в строку?
    #38843538
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как сделать функцию для конкатенации столбца в строку?
    #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
Как сделать функцию для конкатенации столбца в строку?
    #38890063
Mike_za
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Clr агрегаты. Но для 2005 максимальный размер склейки будет 8000 байт.
Самое быстрое, как я понимаю - это через xml? Но там за раз все строки таблицы клеются
...
Рейтинг: 0 / 0
Как сделать функцию для конкатенации столбца в строку?
    #38890349
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mike_za,

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


Код: sql
1.
select * from [таблица] for xml auto;
...
Рейтинг: 0 / 0
Как сделать функцию для конкатенации столбца в строку?
    #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
Как сделать функцию для конкатенации столбца в строку?
    #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
Как сделать функцию для конкатенации столбца в строку?
    #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
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать функцию для конкатенации столбца в строку?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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