2011-01-10 10 views
6

io non sono molto sicuro come chiedere questo, ma vorrei chiedere con l'esempio:Passando fila 'corrente' a una funzione in SQL Server

Ho una tabella al di là che non posso cambiare la struttura su. Registra i depositi in contanti presso i terminali ATM e dispone di una colonna per ogni taglio di banconote. In questo momento quando ho bisogno del valore complessivo di un deposito ho bisogno di codice come questo:

(rd.Count_R10 * 10) + (rd.Count_R20 * 20) + (rd.Count_R50 * 50) + (rd.Count_R100 * 100) + (rd.Count_R200 * 200) 

Vorrei scrivere una funzione T-SQL che mi dà quel valore totale, ma per qualsiasi riga, non per un intero interrogazione, quindi la mia funzione sarebbe qualcosa di simile:

CREATE FUNCTION DepositTotal 
(
    @row ???? 
) 
RETURNS money 
AS 
BEGIN 
    RETURN (row.Count_R10 * 10) + (row.Count_R20 * 20) + (row.Count_R50 * 50) + (row.Count_R100 * 100) + (row.Count_R200 * 200) 
END 

quindi vorrei chiamarlo qualcosa come:

select 
     DepositDate 
    , DepositTotal(thisRow) 
    , BatchId 
from Deposits 

risposta

6

ha la soluzione deve essere una funzione? O è il fattore limitante che non è possibile modificare la struttura del tavolo? Si potrebbe scrivere una vista sul tavolo che aggiunge una colonna con il valore totale ..

CREATE VIEW DepositsWithTotal 

select 
    Deposits.* -- Expand this - I just don't know your schema 
, DepositTotal = (Count_R10 * 10) + (Count_R20 * 20) + (Count_R50 * 50) + (Count_R100 * 100) + (Count_R200 * 200) 

from Deposits 

Poi basta scegliere tra DepositsWithTotal invece di Deposits

+0

+1 Views sarebbe la soluzione migliore per questo. –

+0

Oppure implementare lo stesso come una colonna calcolata. La vista è meno invasiva anche se non si modifica lo schema della tabella sottostante. –

2

Questo sarebbe utile per la modularizzazione del codice, ma sicuramente non è possibile con funzioni TSQL.

L'unico modo di farlo utilizzando un UDF sarebbe quello di passare nel PK della riga e ottenere la funzione per cercarlo (inefficiente) o passare tutti i valori singolarmente (ingombranti).

Forse vale un suggerimento per il sito Microsoft Connect anche se ho appena visto Brett's answer e in effetti le viste o le colonne calcolate sembrano dare questa funzionalità.

1

È possibile utilizzare una funzione con valori di tabella per passare una riga a una funzione (SQL Server 2008 e versioni successive). Penso che una normale funzione scalare sarebbe un'alternativa migliore nel tuo caso però.

+0

Parametro con valori stimati Penso che intendi? Me ne sono dimenticato. –

+0

@ Martin: Sì, intendevo un parametro TV: http://msdn.microsoft.com/en-us/library/bb510489.aspx – sqlvogel

Problemi correlati