Campos calculados

11/03/2009 - 19:24 por José Antonio Muñoz | Informe spam
Hola al grupo,

En la ayuda de SQL Server 2008 he leido que un campo calculado no puede ser
una subconsulta pero si puede ser una función escalar, entonces mi pregunta
es ¿puedo crear un campo calculado en una tabla "X" que obtiene, a través de
una función escalar creada previamente y que incluye una consulta, un valor
de otra tabla "Y"?

Es decir, me explico a través de un sencillo ejemplo; tengo una tabla X:

CREATE TABLE x
(
Codigo Int,
Fecha As Dbo.ObtieneFecha(Codigo)
)

Y tengo una función:

CREATE FUNCTION Dbo.ObtieneFecha ( @Codigo Int ) RETURNS Date
AS
BEGIN
DECLARE @Fecha Date
SELECT @Fecha=Fecha FROM Y WHERE Codigo=@Codigo
RETURN @Fecha
END

¿Hasta que punto se pueden incluir este tipo de campos calculados en una
tabla? ¿Qué inconvenientes tendría? ¿Donde está el límite si la consulta se
complica aún más con otras consultas? ¿Sería aconsejable hacerlo en vez de
tener un campo normal que a través de una aplicación voy calculando a partir
de esas consultas?

Gracias por vuestra atención y saludos,
José Antonio Muñoz.
 

Leer las respuestas

#1 Alejandro Mesa
11/03/2009 - 21:00 | Informe spam
José Antonio Muñoz,

De poder hacerlo, claro que se puede, pero cual es el proposito de tener
este campo calculado.

1 - Cada vez que selecciones de la tabla e incluyas este campo en la lista
de columnas en la select, la funcion se tendra que ejecutar por cada fila
seleccionada. Esto puede traerte serios problemas de desempanio de una query.

Esto se puede evitar si haces una union de ambas tabla para traer el valor
de la otra columna.

2 - Para evitar lo anterior, tendrias que crear esa columna calculada con
opcion PERSISTED. Pero entonces que pasa si ese valor cambia en la otra
tabla, es eso importante para lo que tratas de hacer?

La mala noticia es que si tu funcion accesa alguna otra tabla, entonces esta
no puede ser usada para crear una columna calculada como persisted.

Si nos comentas con mas detalle el proposito de lo que deseas hacer, quizas
alguien pueda darte alguna otra alternativa. Por ejemplo, pudieras llenar esa
columna usando un trigger.


AMB


"José Antonio Muñoz" wrote:

Hola al grupo,

En la ayuda de SQL Server 2008 he leido que un campo calculado no puede ser
una subconsulta pero si puede ser una función escalar, entonces mi pregunta
es ¿puedo crear un campo calculado en una tabla "X" que obtiene, a través de
una función escalar creada previamente y que incluye una consulta, un valor
de otra tabla "Y"?

Es decir, me explico a través de un sencillo ejemplo; tengo una tabla X:

CREATE TABLE x
(
Codigo Int,
Fecha As Dbo.ObtieneFecha(Codigo)
)

Y tengo una función:

CREATE FUNCTION Dbo.ObtieneFecha ( @Codigo Int ) RETURNS Date
AS
BEGIN
DECLARE @Fecha Date
SELECT @Fecha=Fecha FROM Y WHERE Codigo=@Codigo
RETURN @Fecha
END

¿Hasta que punto se pueden incluir este tipo de campos calculados en una
tabla? ¿Qué inconvenientes tendría? ¿Donde está el límite si la consulta se
complica aún más con otras consultas? ¿Sería aconsejable hacerlo en vez de
tener un campo normal que a través de una aplicación voy calculando a partir
de esas consultas?

Gracias por vuestra atención y saludos,
José Antonio Muñoz.


Preguntas similares