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

#1 Miguel Egea
17/10/2006 - 09:46 | Informe spam
No, es por como lo has escrito, te paso un ejemplo para la tabla
person.contact de adventureworks. El ejemplo es bastante estúpido, pero creo
que la sintaxis la verás clara.

alter table person.contact add check ( Title like case when
firstname='Margaret' and ContactID=7

then 'Ms.' else '%' end )



Saludos

Miguel Egea

"Gregorio López" wrote in message
news:%
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.

Respuesta Responder a este mensaje
#2 Alejandro Mesa
17/10/2006 - 15:07 | Informe spam
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.



Respuesta Responder a este mensaje
#3 Gregorio López
17/10/2006 - 18:42 | Informe spam
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.



Respuesta Responder a este mensaje
#4 Alejandro Mesa
17/10/2006 - 20:41 | Informe spam
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.
>>
>>
>>



Respuesta Responder a este mensaje
#5 Gregorio López
18/10/2006 - 02:54 | Informe spam
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.
>>
>>
>>



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida