Nie można uzyskać dostępu do tabel tymczasowych z poziomu funkcji SQL. Będziesz musiał użyć zmiennych tabeli, więc zasadniczo:
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
Edytuj
Na podstawie komentarzy do tego pytania tutaj jest moja rekomendacja. Chcesz połączyć wyniki procedury lub funkcji z wartościami przechowywanymi w tabeli w innym zapytaniu. Pokażę Ci, jak możesz to zrobić, a następnie wybierz ten, który wolisz. Będę używał przykładowego kodu z jednego z moich schematów, ale powinieneś być w stanie go dostosować. Oba są opłacalnymi rozwiązaniami najpierw z procedurą składowaną.
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
W takim przypadku musisz zadeklarować tymczasową tabelę lub zmienną tabeli do przechowywania wyników procedury. Teraz spójrzmy, jak byś to zrobił, gdybyś używał UDF
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Jak widać, UDF jest o wiele bardziej zwięzły, łatwiejszy do odczytania i prawdopodobnie działa trochę lepiej, ponieważ nie używasz pomocniczej tabeli tymczasowej (wydajność jest z mojej strony całkowitym przypuszczeniem).
Jeśli zamierzasz ponownie wykorzystać swoją funkcję/procedurę w wielu innych miejscach, myślę, że UDF jest najlepszym wyborem. Jedynym haczykiem jest to, że będziesz musiał przestać używać tabel #Temp i używać zmiennych tabel. O ile nie indeksujesz tabeli tymczasowej, nie powinno być problemu i będziesz używać mniej danych tempDb, ponieważ zmienne tabeli są przechowywane w pamięci.