No puede acceder a tablas temporales desde dentro de una función SQL. Necesitará usar variables de tabla tan esencialmente:
ALTER FUNCTION FnGetCompanyIdWithCategories()
RETURNS @rtnTable TABLE
(
-- columns returned by the function
ID UNIQUEIDENTIFIER NOT NULL,
Name nvarchar(255) NOT NULL
)
AS
BEGIN
DECLARE @TempTable table (id uniqueidentifier, name nvarchar(255)....)
insert into @myTable
select from your stuff
--This select returns data
insert into @rtnTable
SELECT ID, name FROM @mytable
return
END
Editar
Basado en los comentarios a esta pregunta, aquí está mi recomendación. Desea unir los resultados de un procedimiento o una función con valores de tabla en otra consulta. Te mostraré cómo puedes hacerlo y luego eliges el que prefieras. Voy a usar un código de muestra de uno de mis esquemas, pero debería poder adaptarlo. Ambas son soluciones viables primero con un procedimiento almacenado.
declare @table as table (id int, name nvarchar(50),templateid int,account nvarchar(50))
insert into @table
execute industry_getall
select *
from @table
inner join [user]
on account=[user].loginname
En este caso, debe declarar una tabla temporal o una variable de tabla para almacenar los resultados del procedimiento. Ahora veamos cómo harías esto si estuvieras usando un UDF
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Como puede ver, el UDF es mucho más conciso, más fácil de leer y probablemente funciona un poco mejor ya que no está usando la tabla temporal secundaria (el rendimiento es una suposición completa de mi parte).
Si va a reutilizar su función/procedimiento en muchos otros lugares, creo que UDF es su mejor opción. El único inconveniente es que tendrá que dejar de usar tablas #Temp y usar variables de tabla. A menos que esté indexando su tabla temporal, no debería haber ningún problema, y utilizará tempDb menos ya que las variables de la tabla se mantienen en la memoria.