En los scripts, tiene más opciones y una mejor oportunidad de descomposición racional. Mire en el modo SQLCMD (menú de consulta -> modo SQLCMD), específicamente los comandos: setvar y: r.
Dentro de un procedimiento almacenado, sus opciones son muy limitadas. No puede crear una función definida directamente con el cuerpo de un procedimiento. Lo mejor que puede hacer es algo como esto, con SQL dinámico:
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
Esto se aproxima a una función temporal global, si tal cosa existiera. Todavía es visible para otros usuarios. Puede agregar el @@ SPID de su conexión para unificar el nombre, pero eso requeriría que el resto del procedimiento también use SQL dinámico.