K dočasným tabulkám nemůžete přistupovat z funkce SQL. Proměnné tabulky budete muset používat v podstatě takto:
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
Upravit
Na základě komentářů k této otázce zde je moje doporučení. Chcete spojit výsledky procedury nebo funkce s hodnotou tabulky v jiném dotazu. Ukážu vám, jak to můžete udělat, pak si vyberte ten, který se vám líbí. Budu používat ukázkový kód z jednoho z mých schémat, ale měli byste být schopni jej přizpůsobit. Oba jsou životaschopná řešení nejprve s uloženou procedurou.
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
V tomto případě musíte deklarovat dočasnou tabulku nebo proměnnou tabulky pro uložení výsledků procedury. Nyní se podívejme, jak byste to udělali, kdybyste používali UDF
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Jak můžete vidět, UDF je mnohem stručnější, snadněji se čte a pravděpodobně funguje o něco lépe, protože nepoužíváte sekundární dočasnou tabulku (výkon je z mé strany úplný odhad).
Pokud budete znovu používat svou funkci/postup na mnoha jiných místech, myslím, že UDF je vaše nejlepší volba. Jediný háček je, že budete muset přestat používat tabulky #Temp a používat proměnné tabulky. Pokud neindexujete svou dočasnou tabulku, neměl by nastat žádný problém a tempDb budete používat méně, protože proměnné tabulky jsou uchovávány v paměti.