sql >> Database >  >> RDS >> Sqlserver

tsql retourneert een tabel van een functie of winkelprocedure

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.



  1. Java Multicast Time To Live is altijd 0

  2. Verkrijg het verschil tussen twee datums, zowel in maanden als dagen in sql

  3. PostgreSQL geparametriseerde Order By / Limit in tabelfunctie

  4. Three table join met andere joins dan INNER JOIN