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

tsql restituisce una tabella da una funzione o una procedura di archivio

Non è possibile accedere alle tabelle temporanee da una funzione SQL. Dovrai usare le variabili di tabella così essenzialmente:

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

Modifica

Sulla base dei commenti a questa domanda, ecco la mia raccomandazione. Si desidera unire i risultati di una procedura o di una funzione con valori di tabella in un'altra query. Ti mostrerò come puoi farlo, poi scegli quello che preferisci. Userò il codice di esempio da uno dei miei schemi, ma dovresti essere in grado di adattarlo. Entrambe sono soluzioni praticabili prima con una stored 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 questo caso, devi dichiarare una tabella temporanea o una variabile di tabella per memorizzare i risultati della procedura. Ora diamo un'occhiata a come lo faresti se utilizzassi un UDF

select *
from fn_Industry_GetAll()
inner join [user] 
    on account=[user].loginname

Come puoi vedere, l'UDF è molto più conciso, più facile da leggere e probabilmente funziona un po' meglio poiché non stai utilizzando la tabella temporanea secondaria (le prestazioni sono un'ipotesi completa da parte mia).

Se riutilizzerai la tua funzione/procedura in molti altri posti, penso che l'UDF sia la scelta migliore. L'unico problema è che dovrai smettere di usare le tabelle #Temp e usare le variabili di tabella. A meno che tu non stia indicizzando la tua tabella temporanea, non dovrebbero esserci problemi e utilizzerai meno tempDb poiché le variabili della tabella sono mantenute in memoria.