У сценаріях у вас є більше варіантів і кращий результат раціонального розкладання. Загляньте в режим SQLCMD (меню запитів -> режим SQLCMD), зокрема команди: setvar і: r.
У межах збереженої процедури ваші варіанти дуже обмежені. Ви не можете створити функцію визначення безпосередньо з тілом процедури. Найкраще, що ви можете зробити, - це щось подібне, з динамічним SQL:
create proc DoStuff
as begin
declare @sql nvarchar(max)
/*
define function here, within a string
note the underscore prefix, a good convention for user-defined temporary objects
*/
set @sql = '
create function dbo._object_name_twopart (@object_id int)
returns nvarchar(517) as
begin
return
quotename(object_schema_name(@object_id))+N''.''+
quotename(object_name(@object_id))
end
'
/*
create the function by executing the string, with a conditional object drop upfront
*/
if object_id('dbo._object_name_twopart') is not null drop function _object_name_twopart
exec (@sql)
/*
use the function in a query
*/
select object_id, dbo._object_name_twopart(object_id)
from sys.objects
where type = 'U'
/*
clean up
*/
drop function _object_name_twopart
end
go
Це наближає до глобальної тимчасової функції, якщо така річ існувала. Це все ще видно іншим користувачам. Ви можете додати @@ SPID свого з'єднання для унікальної імені, але це вимагатиме решти процедури використовувати й динамічний SQL.