Pregunta

Hasta ahora he estado usando ISNULL(dbo.fn_GetPrice(ItemId), 0) para que sea no anulable (y no lo llaman con valores predeterminados, pero lo que sea).

¿Es este el camino correcto?

¿Fue útil?

Solución

Sí, esa es la forma correcta de hacerlo. Mediante el uso de la función isnull que está creando una expresión que debe devolver un valor, no importa qué. Esto se evalúa por SQL Server para ser una columna calculada que se not null.

Otros consejos

Yo prefiero la función COALESCE estándar ANSI, pero ISNULL está bien. Para usar COALESCE, definir su columna calculada como:

COALESCE(dbo.fn_GetPrice(ItemId), 0)

Editar Aprender algo nuevo cada día. Hice lo siguiente:

create table t (c1 int null
    , c2 as isnull(c1, 1) 
    , c3 as isnull(c1, null)
    , c4 as coalesce(c1, 1)
    , c5 as coalesce(c1, null)
    )

exec sp_help t

y C2 de hecho no es anulable según sp_help, pero c4 se informa que es anulable, a pesar de que no hay manera de que se aglutinan expresión podría resultar en un valor nulo.

También a partir de 2008, no sé si existe la opción en 2005, uno puede persistir una columna calculada y añadir una restricción:

create table t (c1 int null
    , c2 as isnull(c1, 1) persisted not null
    , c3 as isnull(c1, null) persisted not null
    , c4 as coalesce(c1, 1) persisted not null
    , c5 as coalesce(c1, null) persisted not null
    )
go
insert into t (c1) values (null)

da como resultado una violación de restricción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top