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

Откуда: Железнодорожный
Сообщений: 242
SQL Server 2005 SP3

есть некая user defined функция
[dbo].[GetMyID]()
которая в рамках сессии возвращает одно и то же

далее, есть такое удаление

Delete from [VeryBigTable]
where [ID] = ( [dbo].[GetMyID]() )


гарантирует ли кто нибудь, что [dbo].[GetMyID]() будет вызвана лишь однажды?
26 май 09, 15:30    [7229398]     Ответить | Цитировать Сообщить модератору
 Re: user defined функция в условии запроса  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
гарантирует ли кто нибудь, что [dbo].[GetMyID]() будет вызвана лишь однажды?


гарантировать это может только явное присвоение результата функции переменной и использовании этой переменной в условии запроса.
26 май 09, 15:50    [7229587]     Ответить | Цитировать Сообщить модератору
 Re: user defined функция в условии запроса  [new]
Денис Ильин
Member

Откуда: Железнодорожный
Сообщений: 242
понял, спасибо.
так и сделаем.
26 май 09, 15:51    [7229599]     Ответить | Цитировать Сообщить модератору
 Re: user defined функция в условии запроса  [new]
Crimean
Member

Откуда:
Сообщений: 13148
есть такой прием

where [ID] = ( SELECT [dbo].[GetMyID]() )

это не панацея, но иногда помогает
26 май 09, 17:46    [7230654]     Ответить | Цитировать Сообщить модератору
 Re: user defined функция в условии запроса  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
А чё в плане запроса не видно?
26 май 09, 20:25    [7231259]     Ответить | Цитировать Сообщить модератору
 Re: user defined функция в условии запроса  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Mnior
А чё в плане запроса не видно?


не видно ЧТО?

use tempdb
go

set nocount on
go

create function dbo.f1()
returns char(2)
as
begin
return 'S'
end
go

set showplan_text on
go

select id, xtype, name from sysobjects where xtype = dbo.f1()
go

select id, xtype, name from sysobjects where xtype = ( select dbo.f1())
go

set showplan_text off
go

drop function dbo.f1
go

по-моему как раз все видно:

StmtText                                                                                                                                                                          
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  |--Filter(WHERE:([Expr1003]=[tempdb].[dbo].[f1]() AND has_access('CO',[tempdb].[sys].[sysschobjs].[id])=(1)))
       |--Compute Scalar(DEFINE:([Expr1003]=CONVERT(char(2),[tempdb].[sys].[sysschobjs].[type],0)))
            |--Clustered Index Scan(OBJECT:([tempdb].[sys].[sysschobjs].[clst]), WHERE:([tempdb].[sys].[sysschobjs].[nsclass]=(0) AND [tempdb].[sys].[sysschobjs].[pclass]=(1)))



StmtText                                                                                                                                                                               
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  |--Nested Loops(Inner Join, WHERE:([Expr1003]=[Expr1023]))
       |--Compute Scalar(DEFINE:([Expr1023]=[tempdb].[dbo].[f1]()))
       |    |--Constant Scan
       |--Filter(WHERE:(has_access('CO',[tempdb].[sys].[sysschobjs].[id])=(1)))
            |--Compute Scalar(DEFINE:([Expr1003]=CONVERT(char(2),[tempdb].[sys].[sysschobjs].[type],0)))
                 |--Clustered Index Scan(OBJECT:([tempdb].[sys].[sysschobjs].[clst]), WHERE:([tempdb].[sys].[sysschobjs].[nsclass]=(0) AND [tempdb].[sys].[sysschobjs].[pclass]=(1)))
26 май 09, 22:40    [7231623]     Ответить | Цитировать Сообщить модератору
 Re: user defined функция в условии запроса  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Crimean, вопрос был топикастеру.
Отлично, ещё и пример показали. ;)

Нельзя вслепую сказать, как поведёт себя сиквел на 100%, так что планы в зубы и никаких лишних вопросов возникать не будут.
27 май 09, 01:26    [7231879]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить