Du kan ikke få adgang til midlertidige tabeller fra en SQL-funktion. Du skal bruge tabelvariabler i det væsentlige:
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
Rediger
Baseret på kommentarer til dette spørgsmål er her min anbefaling. Du ønsker at sammenføje resultaterne af enten en procedure eller tabel-værdi i en anden forespørgsel. Jeg vil vise dig, hvordan du kan gøre det, så vælger du den, du foretrækker. Jeg kommer til at bruge eksempelkode fra et af mine skemaer, men du burde være i stand til at tilpasse det. Begge er levedygtige løsninger først med en lagret procedure.
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 dette tilfælde skal du erklære en midlertidig tabel eller tabelvariabel for at gemme resultaterne af proceduren. Lad os nu se på, hvordan du ville gøre dette, hvis du brugte en UDF
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Som du kan se, er UDF'en meget mere kortfattet lettere at læse, og den yder sandsynligvis en smule bedre, da du ikke bruger den sekundære midlertidige tabel (ydeevne er et komplet gæt fra min side).
Hvis du skal genbruge din funktion/procedure mange andre steder, tror jeg, at UDF er dit bedste valg. Den eneste fangst er, at du bliver nødt til at stoppe med at bruge #Temp-tabeller og bruge tabelvariabler. Medmindre du indekserer din temp-tabel, skulle der ikke være noget problem, og du vil bruge tempDb mindre, da tabelvariabler gemmes i hukommelsen.