Не можете да получите достъп до временни таблици от SQL функция. Ще трябва да използвате променливи в таблицата по същество:
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
Редактиране
Въз основа на коментарите към този въпрос ето моята препоръка. Искате да обедините резултатите от процедура или функция с таблична стойност в друга заявка. Ще ви покажа как можете да го направите, след което изберете този, който предпочитате. Ще използвам примерен код от една от моите схеми, но трябва да можете да го адаптирате. И двете са жизнеспособни решения, първо със съхранена процедура.
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
В този случай трябва да декларирате временна таблица или променлива на таблица, за да съхранявате резултатите от процедурата. Сега нека да разгледаме как бихте направили това, ако използвате UDF
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Както можете да видите, UDF е много по-сбит, по-лесен за четене и вероятно се представя малко по-добре, тъй като не използвате вторичната временна таблица (производителността е пълно предположение от моя страна).
Ако ще използвате повторно вашата функция/процедура на много други места, мисля, че UDF е най-добрият ви избор. Единствената уловка е, че ще трябва да спрете да използвате таблици #Temp и да използвате таблични променливи. Освен ако не индексирате вашата временна таблица, не би трябвало да има проблем и ще използвате tempDb по-малко, тъй като променливите на таблицата се съхраняват в паметта.