Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Help pls!
|
|||
|---|---|---|---|
|
#18+
Я прочитал в BOL, что MsSql Server не поддерживает user defined function T-Sql. Каким образом можно реализовать select, чтобы в нем в условии вызвать какую-либо свою функцию? Функция должна хитрым образом обрабатывать входные параметры и возвращать datetime и если ее текст вставлять в запросы где она должна использоваться, то они будут слишком большими и нечитаемыми. Подскажите плиз! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2001, 16:12 |
|
||
|
Help pls!
|
|||
|---|---|---|---|
|
#18+
UDF реализованы в версии MS SQL Server 2000. В более ранних их действительно нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2001, 18:01 |
|
||
|
Help pls!
|
|||
|---|---|---|---|
|
#18+
А вы не подскажете как можно реализовать это без UDF? Может быть с помощью stored procedure? Но ведь их нельзя использовать в select-ах??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2001, 18:07 |
|
||
|
Help pls!
|
|||
|---|---|---|---|
|
#18+
Что мешает результат процедуры использовать в селекте? В данном случае, запрос просто будет состоять из вызова процедуры и селекта. exec MyCoolSmartProcedure @param1, @param2, ..., @date OUT select .... where ThatDate=@date ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2001, 06:45 |
|
||
|
Help pls!
|
|||
|---|---|---|---|
|
#18+
1. В том то и дело что я делаю запросы из сервлета на Яве, а не на сервере 2. Результат этого кода будет меняться для каждой строки выборки (я делаю запрос по таблице Tab1, в которой есть поле N, а условие хотелось бы увидеть в секции where как, например, where MyFunc(Tab1.N) < MyDate ) 3. Напоминаю, речь идет об SqlServer 7.0, который не поддерживает UDF T-SQL 4. Т.е. я хотел бы внутри запроса вычислять значение с пом. функции (или процедуры) и тут же его подставлять в условие Может есть какой-нить выход? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2001, 13:28 |
|
||
|
Help pls!
|
|||
|---|---|---|---|
|
#18+
Хотя подробности задачи не описаны, но обычный подход следующий Создать хранимую процедуру (например MyProc) в которой 1. создать курсор по таблице 2. открыть курсор, далее в цикле по курсору 3. обработать поле N, получить дату 4. записать это поле и другие нужные поля во временную таблицу (например, #tmp) 5. закрыть курсор 6. вывести данные: select * from #tmp В сервлете получить данные сформировав RecordSet на основе запроса "exec MyProc par1, par2 ..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2001, 14:07 |
|
||
|
Help pls!
|
|||
|---|---|---|---|
|
#18+
Спасибо, попробую сделать так. Конечно, не очень красиво, т.к. придеться создавать хранимую процедуру для каждого запроса Может есть еще какие-нить варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2001, 15:01 |
|
||
|
Help pls!
|
|||
|---|---|---|---|
|
#18+
Надеюсь получить еще какой-нибудь совет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2001, 16:07 |
|
||
|
Help pls!
|
|||
|---|---|---|---|
|
#18+
Подобный, либо НЕ подобный подход требует принятия тщательно взвешенного решения. Рекомендую тщательно подумать, прежде чем использовать что-либо функцие-подобное. Я юзаю 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 в любом случае будет сначала выполнять полное сканирование таблицы, выборку всех записей, передачу этих записей в план запроса, из которого вызвана функция, и только после этого фильтрацию записей с повторным сканирование всего набора данных. Согласитесь, разница существенная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2001, 16:17 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32017398&tid=1824864]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 219ms |
| total: | 358ms |

| 0 / 0 |
