2011-01-10 9 views
6

no estoy muy seguro de cómo hacer esto, pero déjame preguntarte por ejemplo:fila 'actual' a una función en SQL Server

Tengo una tabla más allá de eso, no puedo cambiar la estructura de. Registra depósitos en efectivo en terminales tipo ATM, y tiene una columna por cada denominación de nota monetaria. En este momento cuando necesito el valor total de un depósito que necesito código como este:

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

me gustaría escribir una función de T-SQL que me da ese valor total, pero para cualquier fila, no para toda una consulta, por lo que mi función sería algo así como:

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 

Entonces yo diría que es algo así como:

select 
     DepositDate 
    , DepositTotal(thisRow) 
    , BatchId 
from Deposits 

Respuesta

6

¿la solución tiene que ser una función? ¿O es el factor limitante que no se puede alterar la estructura de la mesa? Se podría escribir una vista sobre la mesa que agrega una columna con su valor total ..

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 

A continuación, sólo seleccionar entre DepositsWithTotal en lugar de Deposits

+0

+1 Las vistas serían la mejor solución para esto. –

+0

O implemente lo mismo que una columna calculada. La vista es menos invasiva, ya que no cambia el esquema de la tabla subyacente. –

2

Esto sería útil para la modularización de código, pero definitivamente no es posible con funciones TSQL.

La única manera de hacerlo con un UDF sería pasar el PK de la fila y obtener la función para buscarlo (ineficiente) o pasar todos los valores individualmente (incómodo).

Quizás vale la pena una sugerencia para el sitio de Microsoft Connect aunque acabo de ver Brett's answer y, de hecho, las vistas o las columnas calculadas parecen dar esta funcionalidad.

1

Puede usar una función con valores de tabla para pasar una fila a una función (SQL Server 2008 y posterior). Creo que una función escalar regular sería una mejor alternativa en tu caso.

+0

Parámetro valorado en la tabla ¿A qué se refiere? Me olvidé de esos. –

+0

@Martin: Sí, quise decir un parámetro de TV: http://msdn.microsoft.com/en-us/library/bb510489.aspx – sqlvogel

Cuestiones relacionadas