powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Help pls!
10 сообщений из 10, страница 1 из 1
Help pls!
    #32017365
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я прочитал в BOL, что MsSql Server не поддерживает user defined function T-Sql.
Каким образом можно реализовать select, чтобы в нем в условии вызвать какую-либо свою функцию? Функция должна хитрым образом обрабатывать входные параметры и возвращать datetime и если ее текст вставлять в запросы где она должна использоваться, то они будут слишком большими и нечитаемыми. Подскажите плиз!
...
Рейтинг: 0 / 0
Help pls!
    #32017369
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UDF реализованы в версии MS SQL Server 2000. В более ранних их действительно нет.
...
Рейтинг: 0 / 0
Help pls!
    #32017370
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы не подскажете как можно реализовать это без UDF? Может быть с помощью stored procedure? Но ведь их нельзя использовать в select-ах???
...
Рейтинг: 0 / 0
Help pls!
    #32017379
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
???
...
Рейтинг: 0 / 0
Help pls!
    #32017398
Что мешает результат процедуры использовать в селекте?
В данном случае, запрос просто будет состоять из вызова процедуры и селекта.

exec MyCoolSmartProcedure @param1, @param2, ..., @date OUT
select .... where ThatDate=@date
...
Рейтинг: 0 / 0
Help pls!
    #32017454
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. В том то и дело что я делаю запросы из сервлета на Яве, а не на сервере
2. Результат этого кода будет меняться для каждой строки выборки (я делаю запрос по таблице Tab1, в которой есть поле N, а условие хотелось бы увидеть в секции where как, например,
where MyFunc(Tab1.N) < MyDate )
3. Напоминаю, речь идет об SqlServer 7.0, который не поддерживает UDF T-SQL
4. Т.е. я хотел бы внутри запроса вычислять значение с пом. функции (или процедуры) и тут же его подставлять в условие

Может есть какой-нить выход?
...
Рейтинг: 0 / 0
Help pls!
    #32017462
Pandre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя подробности задачи не описаны, но обычный подход следующий
Создать хранимую процедуру (например MyProc) в которой
1. создать курсор по таблице
2. открыть курсор, далее в цикле по курсору
3. обработать поле N, получить дату
4. записать это поле и другие нужные поля во временную таблицу (например, #tmp)
5. закрыть курсор
6. вывести данные: select * from #tmp
В сервлете получить данные сформировав RecordSet на основе запроса
"exec MyProc par1, par2 ..."
...
Рейтинг: 0 / 0
Help pls!
    #32017470
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, попробую сделать так.
Конечно, не очень красиво, т.к. придеться создавать хранимую процедуру для каждого запроса

Может есть еще какие-нить варианты?
...
Рейтинг: 0 / 0
Help pls!
    #32017596
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь получить еще какой-нибудь совет
...
Рейтинг: 0 / 0
Help pls!
    #32017711
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобный, либо НЕ подобный подход требует принятия тщательно взвешенного решения. Рекомендую тщательно подумать, прежде чем использовать что-либо функцие-подобное. Я юзаю SQL-2000, но стараюсь избегать использования UDF, которые возвращают скалярные значения, используемые внутри запросов, например, во фразе WHERE. Конечно, подобный подход существенно упрощает написание кода, поскольку позволяет его разбить на структурно автономные "черные ящики". Однако, тормоза при вызове функций возникают тоже приличные. Следует учесть, что функция вызывается для каждой записи набора данных. При этом происходит сохранение точки возврата в стекоподобной структуре, передача параметров, выполнение полностью обособленного скрипта, план выполнения которого не может оптимизироваться, объединившись с планом выполнения базового запроса. В результате в подобных запросах происходит, как правило, очень много совершенно излишних шевелений данными плюс операции над стеком, что приводит к существенному притормаживанию.
Очень часто действия, выполняемые в функции, можно объединить с действиями, выполняемыми в базовом запросе, в один скрипт. Когда это действительно возможно, я всегда так и делаю. Да это приводит к громоздким и малопонятным текстам запросов с подзапросами, однако у такого запроса единый монолитный план выполнения, который может быть оптимизирован и чаще всего он действительно лучше оптимизируется, нежели более понятные два скрипта, вызывающие один другой.
Я пришел к выводу, что из всего механизма UDF наиболее полезными на практике являются inline-функции, возвращающие table. Не зря MS отделила inline-функции от всех прочих, в том числе и синтаксически. Их план выполнения может сливаться с планом выполнения базового запроса и проходить совокупную оптимизацию.
Приведу два примера.
1. НЕ inline-функция.
create function Fn()
returns @T table (Fld int)
as
begin
insert into @T
select SomeField from SomeTable
end

2. Inline-функция.
create function Fn()
returns table
as
return select SomeField as Fld from SomeTable

Обе функции, по-сути, выполняют одно и то же. Теперь допустим, что SomeTable содержит 1000000 записей и по полю SomeField построен индекс.
Запускаем запрос:
select * from dbo.Fn() where Fld=5

Если при этом вызывается функция варианта 1, ее выполнение может потребовать нескольких минут. Если вызывается функция варианта 2, она выполнится за доли секунды. Почему такая разница?
Потому что условие фильтрации, заданное в конечном запросе, способно подняться по плану выполнения запроса, проникнуть в план выполнения inline-функции и заставить фильтровать записи на ранней стадии - в теле самой функции. Функция же варианта 2 в любом случае будет сначала выполнять полное сканирование таблицы, выборку всех записей, передачу этих записей в план запроса, из которого вызвана функция, и только после этого фильтрацию записей с повторным сканирование всего набора данных. Согласитесь, разница существенная.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Help pls!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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