Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 пользовательские функции в SQL Server  [new]
OLEG_2005
Member

Откуда:
Сообщений: 1715
Здравствуйте.
Можно ли вызвать пользовательскую функцию БД из клиентской программы?
Простите за идиотский вопрос. Никогда раньше об этом не задумывался.
Заранее спасибо.
10 янв 08, 17:16    [5135870]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
в широком смысле - да
или опосредованно ...


а вы как хотите?
10 янв 08, 17:19    [5135901]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
OLEG_2005
Member

Откуда:
Сообщений: 1715
iSestrin
в широком смысле - да
или опосредованно ...


а вы как хотите?

Непонятно, что вы имеет в виду. MS SQL Server 2000. Из клиентской программы нужно вызвать пользовательскую функцию. Как это сделать?
10 янв 08, 17:24    [5135950]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Из клиентской программы на сервер можно отправить запрос, в котором можно вызвать UDF. Семантика запроса зависит от типа UDF. Подробности BOL->User-Defined Functions->Calling User-Defined Functions/

mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\createdb.chm::/cm_8_des_08_460j.htm
10 янв 08, 17:29    [5135999]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
OLEG_2005
Member

Откуда:
Сообщений: 1715
pkarklin
Из клиентской программы на сервер можно отправить запрос, в котором можно вызвать UDF. Семантика запроса зависит от типа UDF. Подробности BOL->User-Defined Functions->Calling User-Defined Functions/

mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\createdb.chm::/cm_8_des_08_460j.htm


Спасибо посмотрю.
10 янв 08, 17:33    [5136047]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
OLEG_2005
Member

Откуда:
Сообщений: 1715
Пользовательская функция возвращает не данные, а строку.
10 янв 08, 17:57    [5136281]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
OLEG_2005
Пользовательская функция возвращает не данные, а строку.


М.б. сначала с терминологией определиться. Что есть для Вас "данные" и что "строка". Осмелюсь предположить, что 1ое - это одно значение и это скалярная функция, 2ое - запись из нескольких полей и это табличная функция.

Покажите нам хотя бы ее скрипт до AS...
10 янв 08, 17:59    [5136303]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
OLEG_2005
Member

Откуда:
Сообщений: 1715
Пользовательская скалярная функция.
ALTER FUNCTION NameNodeFull(@IDNode integer = NULL) RETURNS nvarchar (200) AS
BEGIN
DECLARE
@RetName nvarchar (200),
@LoadedName nvarchar(200),
@LoadedIDType int,
@Revers bit

SET @Revers = 0
SET @RetName = ''
/*Проход вверх пока не Location*/
WHILE @IDNode IS NOT NULL BEGIN
SELECT @IDNode=IDParent, @LoadedName=Name, @LoadedIDType=IDType FROM TypeNode WHERE IDNode=@IDNode
IF @@ROWCOUNT=0 BREAK -- @ID не найден
IF (@Revers=0 )or(@LoadedIDType Is NULL)
SET @RetName = dbo.SumStr(@LoadedName,@RetName) -- по иерархии
ELSE
SET @RetName = dbo.SumStr(@RetName,@LoadedName) -- обратный иерархии
IF @LoadedIDType is NULL BREAK
END--WHILE
RETURN @RetName
END

Извините, если неясно сформулировал вопрос.
10 янв 08, 18:08    [5136375]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
OLEG_2005
Пользовательская скалярная функция.
Извините, если неясно сформулировал вопрос.


BOL-CREATE FUNCTION
Examples
A. Scalar-valued user-defined function that calculates the ISO week
In this example, a user-defined function, ISOweek, takes a date argument and calculates the ISO week number. For this function to calculate properly, SET DATEFIRST 1 must be invoked before the function is called.

CREATE FUNCTION ISOweek (@DATE datetime)
RETURNS int
AS
BEGIN
DECLARE @ISOweek int
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END

Here is the function call. Notice that DATEFIRST is set to 1.

SET DATEFIRST 1
SELECT master.dbo.ISOweek('12/26/1999') AS 'ISO Week'
10 янв 08, 18:12    [5136408]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: пользовательские функции в SQL Server  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 689
а можно ламерский вопрос.

вот у меня есть запрос, он отрабатывает 1,5 минуты. Такое время недопустимо, подсказали что должно быть 3-5 секунд и могут помочь пользовательские функции... открыл книгу, почитал про них, но не понял как они могу мне помочь... если некоторые части в запросе выведу в пользовательские функции они что будут параллельно выполняться или как?

сервер довольно мощный, в таблице тысяч 40 записей, MS SQL 2008

Спасибо
25 авг 12, 19:33    [13064281]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Sputnick,

пользовательские функции могут только затормозить запрос.
Ускорить - никогда.
25 авг 12, 19:39    [13064290]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
qwerty112
Guest
Sputnick,

вы запрос-то - покажите ...

---

iap
пользовательские функции могут только затормозить запрос.
Ускорить - никогда.

я не в плане спора, а просто не знаю и поэтому спрашиваю
а если несколько однотипных подзапросов ("дериверед тейбл") в запросе, - инлайн функция - "не поможет" ?
понимаю, что правильный ответ тут будет один - "смотрите планы", но всё-таки ... ?
25 авг 12, 20:49    [13064396]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
qwerty112
iap
пользовательские функции могут только затормозить запрос.
Ускорить - никогда.

я не в плане спора, а просто не знаю и поэтому спрашиваю
а если несколько однотипных подзапросов ("дериверед тейбл") в запросе, - инлайн функция - "не поможет" ?
понимаю, что правильный ответ тут будет один - "смотрите планы", но всё-таки ... ?
Если SELECT из inline функции сразу написать в нужных местах запроса, быстрее будет,
чем применение inline функции, которую же серверу надо сначала обработать?
По-любому запрос без функции будет быстрее, разве не так?
25 авг 12, 22:02    [13064545]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
qwerty112
Guest
iap
qwerty112
пропущено...

я не в плане спора, а просто не знаю и поэтому спрашиваю
а если несколько однотипных подзапросов ("дериверед тейбл") в запросе, - инлайн функция - "не поможет" ?
понимаю, что правильный ответ тут будет один - "смотрите планы", но всё-таки ... ?
Если SELECT из inline функции сразу написать в нужных местах запроса, быстрее будет,
чем применение inline функции, которую же серверу надо сначала обработать?
По-любому запрос без функции будет быстрее, разве не так?

я не знаю.

я исходил, из тех же соображений, из которых, обычно, "начинается" "доказывание" плюсов ХП против припеад стейтемент в коде клиента, - то, что ХП - "скомпилированна, для неё, у сервера, есть план выполнения, поэтому - это лучше/быстрее" ...

...вроде бы, аналогия полная (?) ...

более конкретно опишу, что я имею в виду :
с клиента выполняется запрос такого вида
select ....
from
(select со 100500 inner/left join-ами where a=1 and b=2) a
inner join
(тот же select со 100500 inner/left join-ами where a=3 and b=4) a1
...
inner join
(тот же select со 100500 inner/left join-ами where a=N and b=M) aN

будет ли какая-то польза (кроме "наглядности") если подзапрос будет "оформлен" инлайн-функцией
select ....
from dbo.MyFunct (1,2) a1
inner join dbo.MyFunct (3,4) a2
...
inner join dbo.MyFunct (N,M) aN

?
26 авг 12, 00:20    [13065028]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
qwerty112
я исходил, из тех же соображений, из которых, обычно, "начинается" "доказывание" плюсов ХП против припеад стейтемент в коде клиента, - то, что ХП - "скомпилированна, для неё, у сервера, есть план выполнения, поэтому - это лучше/быстрее" ...

...вроде бы, аналогия полная (?) ...
Аналогия неправильная.

Инлайн функция не компилируется. Это в каком то смысле подстановка текста в запрос.
26 авг 12, 00:54    [13065129]     Ответить | Цитировать Сообщить модератору
 Re: пользовательские функции в SQL Server  [new]
qwerty112
Guest
alexeyvg
qwerty112
я исходил, из тех же соображений, из которых, обычно, "начинается" "доказывание" плюсов ХП против припеад стейтемент в коде клиента, - то, что ХП - "скомпилированна, для неё, у сервера, есть план выполнения, поэтому - это лучше/быстрее" ...

...вроде бы, аналогия полная (?) ...
Аналогия неправильная.

Инлайн функция не компилируется. Это в каком то смысле подстановка текста в запрос.


понятно,
спасибо !
26 авг 12, 01:00    [13065142]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить