Как написать UDF?

Николай
Дата: 15.03.2001 19:50:08
Приветствую!
Есть 3 таблицы, одна из которых, соединяя 2 крайние, реализует связь М:М.
Authors(auth_id, name); bk2auth(auth_id, bk_id); books(bk_id....).
Как мне написать UDF, к-рая возвращала бы мне имя автора книги, а если их несколько, - то все ч/з запятую?

Премного благодарен
Garya
Дата: 15.03.2001 20:43:23
Подобная задача обычно решается с помощью цикла по курсору. Следует только учесть, что использовать в теле UDF глобальные курсоры запрещено. Правда, можно использовать локальные.
codd
Дата: 16.03.2001 00:18:58
Очень просто:

CREATE FUNCTION bk2auth (@bk varchar(x))
RETURNS TABLE
AS
select auth_name from Authors A, BK2AUTH C where A.au_id=C.au_id and C.bk_id in (select bk_id from BOOKS where bk_name=@bk)

А вот через запятую можно ADO используя, вывести
SergSuper
Дата: 16.03.2001 09:55:46
Скажи "Нет!" курсорам и циклам!
Минимум работы в клиентской части!
Ребята(Garya и codd), ну что ж вы ерунду советуете?

create function ff(@n varchar(50))
returns varchar(500)
as
begin
declare @s varchar(500)
set @s=''
select @s=@s+name+',' from sysobjects where name like @n
if @s<>'' set @s=substring(@s,1,datalength(@s)-1)
return @s
end
go
create table #t(c varchar(20))

insert #t select 'syso%'
insert #t select 'sysc%'
insert #t select 'sysp%'
go
select c, dbo.ff(c) from #t

Пойдет так?
Николай
Дата: 16.03.2001 15:38:46
2codd: этот способ можно было бы рассматривать как альтернативу, но в случае, если мне эта UDF нужна была для работы клиентского приложения. Но мне необходимо было использовать ее в самих запросах. А я не сформулировал это как надо в вопросе.
2Garya: Я тоже склонялся к такому варианту, пока не прочитал вариант SergSuper.
2SergSuper: Ну что же я могу сказать? У меня просто нет слов. Воистину: некоторые вещи необходимо просто знать.

Всем огромное спасибо!
Garya
Дата: 19.03.2001 16:27:45
2SergSuper. Что я могу сказать? Мне понравилось . Похожее решение было в рассылке Александра Гладченко по Update (через два знака равенства). Чесслово, очень симпатично.
Павел
Дата: 20.03.2001 17:23:46
Ну и спасибо, SergSuper. Эдак походя прочитал, и модифицировал за 2 часа 8 процедур, избавившись от курсоров. Причем код упростился до уровня понимания его разработчиком.
Павел
Дата: 20.03.2001 17:31:26
Ну и спасибо, SergSuper. Эдак походя прочитал, и модифицировал за 2 часа 8 процедур, избавившись от курсоров. Причем код упростился до уровня понимания его разработчиком.