Esiste un modo per creare una funzione definita dall'utente CLR per SQL Server che restituisce più valori senza utilizzare la sintassi della funzione di valore di tabella? Ad esempio, supponiamo di voler eseguire una conversione di coordinate come:UDF CLR di SQL Server con parametri di uscita - È possibile?
[SqlFunction()]
public void ConvertCoordinates(SqlDouble x, SqlDouble y, SqlDouble z, out SqlDouble r, out SqlDouble t, out SqlDouble p)
{
r = new SqlDouble(Math.Sqrt((x.Value*x.Value)+(y.Value*y.Value)+(z.Value*z.Value)));
t = new SqlDouble(Math.Acos(r.Value/z.Value));
p = new SqlDouble(Math.Atan(y.Value/x.Value));
}
È possibile? Una funzione valutata a livello di tabella in questo caso sembra inappropriata perché il calcolo non genererà mai più di una riga di output. Usando la sintassi della funzione con valori scalari, dovrei scrivere tre diverse funzioni per eseguire il calcolo e chiamarle separatamente. Dato il mio caso d'uso reale, questo è altamente impraticabile.
Mi rendo conto che la logica di cui sopra può essere realizzata utilizzando puro T-SQL; il mio caso d'uso reale è più complesso ma comporterebbe comunque una sola riga con più valori di uscita interdipendenti.
Quindi, linea di fondo, è fattibile? Non penso che lo sia, ma si può sperare. Se per caso è fattibile, allora come apparirebbe il T-SQL che chiama tale funzione?
UDF (sia scalare che tabulare, T-SQL o CLR) non possono avere parametri out. Se potessero, dovresti inventare una nuova sintassi per consentire a uno di essere chiamato nella clausola 'SELECT', se tu volessi consumare queste uscite. E non vedo perché una funzione valutata a livello di tabella che restituisce una singola riga ti debba sembrare strana. –
@Damien Questa era semplicemente una questione se fosse possibile o meno.La mia lettura e sperimentazione avevano indicato che probabilmente non lo era (come ho anche affermato), ma poiché sono nuovo all'integrazione CLR, volevo chiedere. Le TVF non sembrano "strane per me" quando più di una riga è una possibilità. L'esempio SEMPRE restituisce una singola riga, tuttavia i valori di ritorno correlati sono significativi solo come un insieme. Nel mio caso di utilizzo reale sto eseguendo un calcolo simile, ma più grande per milioni di righe, quindi un TVF sembra inefficiente solo se i parametri out erano una possibilità. Un semplice "no" sarebbe stato sufficiente. – bporter
@bporter - ovviamente un TVF sarebbe l'opzione migliore - lo dici tu stesso, loro "non sembrano strani quando più di 1 riga è una possibilità" e poi dici che hai milioni di righe. Ergo a (S) TVF è la risposta! Sarà molto più efficiente di iterare su ogni riga come una dichiarazione foreach imperativa. – gbjbaanb