sql >> Database teknologi >  >> RDS >> Sqlserver

tsql returnerer en tabel fra en funktion eller butiksprocedure

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.



  1. Mød Michal Bar og mig hos Microsoft Ignite!

  2. Problemsæt 2 – Identifikation af enheder og attributter

  3. Sådan opretter du en bruger og giver tilladelser i Oracle

  4. Datamigrering mellem forskellige DBMS'er