Du kan inte komma åt tillfälliga tabeller från en SQL-funktion. Du kommer att behöva använda tabellvariabler så huvudsakligen:
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
Redigera
Baserat på kommentarer till denna fråga är här min rekommendation. Du vill sammanfoga resultaten av antingen en procedur eller tabellvärderad funktion i en annan fråga. Jag kommer att visa dig hur du kan göra det och sedan väljer du den du föredrar. Jag kommer att använda exempelkod från ett av mina scheman, men du borde kunna anpassa det. Båda är genomförbara lösningar först med en lagrad procedur.
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
I det här fallet måste du deklarera en temporär tabell eller tabellvariabel för att lagra resultaten av proceduren. Låt oss nu titta på hur du skulle göra detta om du använde en UDF
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Som du kan se är UDF mycket mer kortfattat lättare att läsa och presterar förmodligen lite bättre eftersom du inte använder den sekundära temporära tabellen (prestanda är en fullständig gissning från min sida).
Om du ska återanvända din funktion/procedur på många andra ställen, tror jag att UDF är ditt bästa val. Den enda haken är att du måste sluta använda #Temp-tabeller och använda tabellvariabler. Om du inte indexerar din temptabell bör det inte vara några problem, och du kommer att använda tempDb mindre eftersom tabellvariabler hålls i minnet.