U hebt geen toegang tot tijdelijke tabellen vanuit een SQL-functie. U zult in wezen tabelvariabelen moeten gebruiken:
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
Bewerken
Op basis van opmerkingen over deze vraag is hier mijn aanbeveling. U wilt de resultaten van een procedure of functie met tabelwaarde samenvoegen in een andere query. Ik zal je laten zien hoe je het kunt doen en dan kies je degene die je voorkeur heeft. Ik ga voorbeeldcode van een van mijn schema's gebruiken, maar je zou het moeten kunnen aanpassen. Beide zijn eerst haalbare oplossingen met een opgeslagen 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
In dit geval moet u een tijdelijke tabel of tabelvariabele declareren om de resultaten van de procedure op te slaan. Laten we nu eens kijken hoe u dit zou doen als u een UDF zou gebruiken
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Zoals u kunt zien, is de UDF een stuk beknopter, gemakkelijker te lezen en presteert hij waarschijnlijk een beetje beter omdat u de secundaire tijdelijke tabel niet gebruikt (prestaties zijn een volledige gok van mijn kant).
Als je je functie/procedure op veel andere plaatsen gaat hergebruiken, denk ik dat de UDF je beste keuze is. Het enige nadeel is dat u moet stoppen met het gebruik van #Temp-tabellen en tabelvariabelen moet gebruiken. Tenzij u uw tijdelijke tabel indexeert, zou er geen probleem moeten zijn, en u zult de tempDb minder gebruiken omdat tabelvariabelen in het geheugen worden bewaard.