Dichiarare la variabile nella funzione con valori di tabella


Risposte:


207

Esistono due tipi di funzioni con valori di tabella. Uno che è solo un'istruzione select e uno che può avere più righe di un'istruzione select.

Questo non può avere una variabile:

create function Func() returns table
as
return
select 10 as ColName

Devi fare così invece:

create function Func()
returns @T table(ColName int)
as
begin
  declare @Var int
  set @Var = 10
  insert into @T(ColName) values (@Var)
  return
end

34
Il primo esempio è noto come "Funzione inline con valori di tabella" che presenta vantaggi in termini di prestazioni rispetto a una funzione con valori di tabella a più istruzioni, vale a dire che il server di database può ricomporre la query con l'ITVF integrato nella query principale, diventando essenzialmente un parametro parametrizzato VIEWmentre un MSTVF si comporta più come una stored procedure opaca (sebbene con i suoi vantaggi rispetto a sprocs). Le funzioni inline dovrebbero essere preferite rispetto a MSTVF. Se è necessario calcolare e memorizzare valori intermedi (come il risultato di un'espressione di funzione scalare complessa), utilizzare una sottoquery.
Dai

1
Probabilmente vale anche la pena ricordare che se il risultato di qualsiasi cosa tu stia usando per popolare la variabile che desideri impostare è in qualche modo generalizzabile, potresti prendere in considerazione la scrittura di una funzione separata per generarla. Ciò ti consentirebbe di utilizzare l'ITVF descritto da @Dai sopra, con tutti i suoi vantaggi, pur inserendo un valore generato dinamicamente nella tua funzione. Ho appena scritto una funzione con l'aiuto della soluzione sopra (grazie @MikaelEriksson!) Che passa uno dei suoi parametri a una funzione di supporto per evitare di dover utilizzare il modulo MSTVF.
Naughtilus

1
il costo più grande è l'inserimento per la mia funzione e non so come saltare questo costo senza inserirlo nella variabile della tabella e restituire il risultato della selezione
uzay95

@naughtilus sarebbe fantastico vedere un esempio di questo. Hai considerato di fornire un'altra risposta insieme al tuo suggerimento?
Jacques
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.