Você não pode acessar tabelas temporárias de dentro de uma função SQL. Você precisará usar variáveis de tabela tão essencialmente:
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
Com base nos comentários a esta pergunta, aqui está minha recomendação. Você deseja unir os resultados de um procedimento ou função com valor de tabela em outra consulta. Eu vou te mostrar como você pode fazer isso, então você escolhe o que você prefere. Vou usar o código de exemplo de um dos meus esquemas, mas você deve conseguir adaptá-lo. Ambas são soluções viáveis primeiro com um procedimento armazenado.
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
Neste caso, você deve declarar uma tabela temporária ou variável de tabela para armazenar os resultados do procedimento. Agora vamos ver como você faria isso se estivesse usando uma UDF
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Como você pode ver, a UDF é muito mais concisa, mais fácil de ler e provavelmente funciona um pouco melhor, pois você não está usando a tabela temporária secundária (o desempenho é uma suposição completa da minha parte).
Se você for reutilizar sua função/procedimento em muitos outros lugares, acho que a UDF é sua melhor escolha. O único problema é que você terá que parar de usar tabelas #Temp e usar variáveis de tabela. A menos que você esteja indexando sua tabela temporária, não deve haver problemas e você usará menos o tempDb, pois as variáveis da tabela são mantidas na memória.