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

Откуда: Азербайджан, г. Баку
Сообщений: 1374
Добрый день,

Имеется такой запрос
Select * from myTable Where userID = dbo.fn_current_user_id()


Есть ли возможность дать подсказку, чтобы функция выполнилась всего 1 раз, а не для каждой записи?

PS: по каким причинам не знаю, но заметил что код ниже работает быстрее
Where userID = (Select dbo.fn_current_user_id())
5 окт 17, 10:41    [20844463]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 803
Samir, да, есть.

declare @userId int;

select @userId = dbo.fn_current_user_id();

Select * from myTable Where userID = @userId;
5 окт 17, 10:52    [20844495]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
LSV
Member

Откуда: Киев
Сообщений: 29969
А почему нельзя сначала присвоить в переменную, а потом многократно использовать эту переменную ?
5 окт 17, 10:53    [20844500]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
Samir
Member

Откуда: Азербайджан, г. Баку
Сообщений: 1374
Minamoto,

Есть одна проблема, о которой забыл упомянуть.
Эта функция используется в представлениях для предварительного фильтрования.

Можно там как-то DECLARE ипользовать?
5 окт 17, 11:20    [20844613]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
aleks222
Guest
Samir
PS: по каким причинам не знаю, но заметил что код ниже работает быстрее
Where userID = (Select dbo.fn_current_user_id())


Этот кундштюк преобразует недетерминированную функцию в детерминированную.
Известен со времен MS SQL 2000.
Правда потом, были сведения что в новых версиях "не помогает".

Но если помогает - пользуйся.
5 окт 17, 11:42    [20844756]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
Ролг Хупин
Member

Откуда: Оттуда
Сообщений: 1438
Samir
Minamoto,

Есть одна проблема, о которой забыл упомянуть.
Эта функция используется в представлениях для предварительного фильтрования.

Можно там как-то DECLARE ипользовать?


можно, но будет синтакс еррор
5 окт 17, 12:01    [20844870]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 803
Samir
Minamoto,

Есть одна проблема, о которой забыл упомянуть.
Эта функция используется в представлениях для предварительного фильтрования.

Можно там как-то DECLARE ипользовать?


Можно. Переделать представление в функцию или хранимую процедуру.
На мой вкус, использование функции в представлении - это дурной тон.
5 окт 17, 12:07    [20844902]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 33
Samir,

Samir
Добрый день,

Имеется такой запрос
Select * from myTable Where userID = dbo.fn_current_user_id()


Есть ли возможность дать подсказку, чтобы функция выполнилась всего 1 раз, а не для каждой записи?

PS: по каким причинам не знаю, но заметил что код ниже работает быстрее
Where userID = (Select dbo.fn_current_user_id())

А так можно?
Select * from myTable
inner join   
(Select dbo.fn_current_user_id() user_curr) u
 on  userID = user_curr
5 окт 17, 12:56    [20845127]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
LSV
Member

Откуда: Киев
Сообщений: 29969
Samir
Minamoto,

Есть одна проблема, о которой забыл упомянуть.
Эта функция используется в представлениях для предварительного фильтрования.

Можно там как-то DECLARE ипользовать?
Можно. В CTE.
5 окт 17, 13:26    [20845218]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
iap
Member

Откуда: Москва
Сообщений: 44572
LSV
Samir
Minamoto,

Есть одна проблема, о которой забыл упомянуть.
Эта функция используется в представлениях для предварительного фильтрования.

Можно там как-то DECLARE ипользовать?
Можно. В CTE.
Это как же?
Хочется посмотреть на пример.
5 окт 17, 13:34    [20845259]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
invm
Member

Откуда: Москва
Сообщений: 7450
Samir
Есть ли возможность дать подсказку, чтобы функция выполнилась всего 1 раз, а не для каждой записи?
Подсказки не нужны и их все равно нет. Просто функция должна быть детерминированной.
Для этого:
- функция не должна обращаться к данным
- должна быть создана с опцией schemabinding
5 окт 17, 13:38    [20845282]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
LSV
Member

Откуда: Киев
Сообщений: 29969
iap
LSV
пропущено...
Можно. В CTE.
Это как же?
Хочется посмотреть на пример.
ok
declare @x int

set @x=12;

with sss
as
(select ID from Item where ID < @x)

select * from sss
зы: Как ни странно, но без ";" ругаеццо. :)
5 окт 17, 13:53    [20845345]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
LSV
Member

Откуда: Киев
Сообщений: 29969
Правда CTE это вьюха только в конкретном батче.

Т.е. использовать ее можно только многократно копируя в разных кусках кода.
Зато удобна, параметрически управляема и в отличие от обычной вью знает про врем. таблицы.
5 окт 17, 13:57    [20845363]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
Samir
Member

Откуда: Азербайджан, г. Баку
Сообщений: 1374
petre
Samir,

[/src]

А так можно?
Select * from myTable
inner join   
(Select dbo.fn_current_user_id() user_curr) u
 on  userID = user_curr
[/quot]

Могу написать Cross Apply - это даст скорости?
5 окт 17, 13:58    [20845368]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
Massa52
Member

Откуда:
Сообщений: 207
LSV,

По определению -
WITH
следует либо первым либо после :
5 окт 17, 13:58    [20845369]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение функции 1 раз  [new]
iap
Member

Откуда: Москва
Сообщений: 44572
LSV
iap
пропущено...
Это как же?
Хочется посмотреть на пример.
ok
declare @x int

set @x=12;

with sss
as
(select ID from Item where ID < @x)

select * from sss

зы: Как ни странно, но без ";" ругаеццо. :)
Это называется "DECLARE в CTE", да?
5 окт 17, 15:15    [20845638]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить