Check constraint con CASE

17/10/2006 - 03:33 por Gregorio López | Informe spam
Hola a todos. Estoy tratando de crear una restricción CHECK, la cual depende
de una cierta condición que obliga a usar la instrucción CASE, del tipo
siguiente:

alter table Partes add constraint
CK_PartesFactorConversion check (case when ([Medida1] = [Medida2])
then [FactorConversion] = 1
else [FactorConversion] >= 1
end)

Pero en la línea usando el then marca un error de sintaxis
Incorrect syntax near '='

¿Será que la validación no es posible de esta manera y debe hacerse en un
trigger?.

Saludos y gracias anticipadas.

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
18/10/2006 - 14:41 | Informe spam
Gregorio,

Si me referia a eso. Bueno, ya se que estas al tanto del cambio.

Saludos,

AMB

"Gregorio López" wrote:

Inicialmente el campo FactorConversion lo contemplaba como mayor o igual a
1, pero realmente debe ser mayor que cero (o 1 cuando se cumpla la condición
de los campos de medidas).

¿Te refieres a eso Alejandro?

Saludos.

"Alejandro Mesa" wrote in message
news:
> Gregorio,
>
> Me alegra que hayas comprendido la explicacion que te dimos. Ahora, la
> restriccion final no garantiza el pedido original.
>
> alter table Partes with nocheck
> add constraint CK_PartesFactorConversion
> check ([FactorConversion] = case when ([Medida1] = [Medida2]) then 1
> else [FactorConversion] end and [FactorConversion] >= 1)
> go
>
>
> AMB
>
> "Gregorio López" wrote:
>
>> Gracias Miguel y Alejandro. Con su ayuda, el check quedó de la siguiente
>> manera:
>>
>> alter table Partes with nocheck add constraint
>> CK_PartesFactorConversion check ([FactorConversion] = case when
>> ([Medida1] = [Medida2])
>> then 1
>> else [FactorConversion]
>> end and
>> [FactorConversion] > 0)
>>
>> Saludos.
>>
>> "Alejandro Mesa" wrote in
>> message
>> news:
>> > Gregorio,
>> >
>> > La expresion "case" devuelve un valor, por lo que para usarla en una
>> > expresion logica, esta debe de estar seguida (o ante que esta anteceda)
>> > de
>> > un
>> > operador logico y otra expresion, al menos que se este negando la
>> > expresion
>> > "case".
>> >
>> > <case ... end> <operador_logico> <expresion>
>> > <expresion> <operador_logico> <case ... end>
>> > not <case ... end>
>> >
>> > De la forma que lo estas haciendo, pareciera como que quieres hacer uso
>> > de
>> > una utilidad conocida como "macro-substitucion" y SQL Server no cuenta
>> > con
>> > esa utilidad.
>> >
>> > Ve si esta expresion logica te es de ayuda.
>> >
>> > alter table Partes
>> > add constraint CK_PartesFactorConversion
>> > check (
>> > [FactorConversion] between 1 and
>> > case when [Medida1] = [Medida2] then 1 else convert(int, 0x7FFFFFFF)
>> > end
>> > )
>> > go
>> >
>> > La expresion anterior se interpreta de la siguiente forma. La columna
>> > [FactorConversion] debe estar comprendida en los valores 1 y [?], donde
>> > el
>> > signo de interrogacion es la expresion "case", la cual devuelve un
>> > valor
>> > en
>> > dependencia de la comparacion "when [Medida1] = [Medida2]". Si las
>> > columnas
>> > son iguales devuelve 1, de lo contrario devuelve el maximo valor entero
>> > permitido. Algo asi como:
>> >
>> > if [Medida1] = [Medida2]
>> > if [FactorConversion] between 1 and 1 -- ([FactorConversion] = 1)
>> > print 'ok'
>> > else
>> > print 'no ok'
>> > else
>> > if [FactorConversion] between 1 and convert(int, 0x7FFFFFFF)
>> > print 'ok'
>> > else
>> > print 'no ok'
>> > go
>> >
>> >
>> > AMB
>> >
>> > "Gregorio López" wrote:
>> >
>> >> Hola a todos. Estoy tratando de crear una restricción CHECK, la cual
>> >> depende
>> >> de una cierta condición que obliga a usar la instrucción CASE, del
>> >> tipo
>> >> siguiente:
>> >>
>> >> alter table Partes add constraint
>> >> CK_PartesFactorConversion check (case when ([Medida1] = [Medida2])
>> >> then [FactorConversion] = 1
>> >> else [FactorConversion] >= 1
>> >> end)
>> >>
>> >> Pero en la línea usando el then marca un error de sintaxis
>> >> Incorrect syntax near '='
>> >>
>> >> ¿Será que la validación no es posible de esta manera y debe hacerse en
>> >> un
>> >> trigger?.
>> >>
>> >> Saludos y gracias anticipadas.
>> >>
>> >>
>> >>
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida