Ayuda con validación en un sp

08/03/2006 - 17:06 por Omar | Informe spam
Que tal buen día, nuevamente recurro a ustedes ya que se me presentó el
siguiente problema.

Tengo una tabla con los siguientes campos id_extension, usuario, clave,
descripcion, en el campo clave puede contener NULL o algún valor, pero
si introduzco un valor a este campo necesito que sea único y mi problema
radica en que cuando quiero hacer una actualización de determinado
registro ha algún otro campo que no sea el campo clave no me permite
hacer la actualización ya que la clave ya existe y no me permite hacer
el update, como puedo solucionar este problema de validación?

a continuación expongo el sp que utilizo para el update.


CREATE PROCEDURE dbo.sp_ModificaExtension
@id_extension int,
@usuario varchar (50),
@clave int,
@descripcion varchar (50),
@id_ccostos int,
@tipo_servicio varchar (5),
@desc_tipo_servicio varchar (50),
@id_ext int

AS
DECLARE @ErrorSave INT
SET @ErrorSave = 0

IF NOT EXISTS (select clave from extension where clave=@clave)
BEGIN
UPDATE extension SET
id_extension=@id_extension,
usuario=@usuario,
clave=@clave,
descripcion=@descripcion,
id_ccostos=@id_ccostos,
tipo_servicio= @tipo_servicio,
desc_tipo_servicio=@desc_tipo_servicio
WHERE id_extension=@id_ext
END

IF (@@ERROR <> 0) --Si hay error
SET @ErrorSave = @@ERROR
GO

Muchas gracias por cualquier ayuda.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
09/03/2006 - 17:42 | Informe spam
Omar,

Siempre recomiendo que para este tipo de preguntas se postee la estructura
de la tabla. Cual es la clva eprimaria de esta tabla?

Existen varias formas de forzar valores unicos en un columna que permite
null, la una mediante una vista indexada y la otra mediante el uso de una
columna calculada (esta version me gusta mas).

Ejemplo:

create table t1(
c1 int not null identity unique,
c2 varchar(10) null,
c3 as case when c2 is null then ltrim(c1) else c2 end unique
)
go

insert into t1 default values
insert into t1 default values
go

insert into t1(c2) values('a')
insert into t1(c2) values('b')
go

insert into t1 default values
insert into t1 default values
go

select *
from t1

update t1
set c2 = 'a'
where c1 = 4
go

select *
from t1
go

drop table t1
go


AMB


"Omar" wrote:

Que tal buen día, nuevamente recurro a ustedes ya que se me presentó el
siguiente problema.

Tengo una tabla con los siguientes campos id_extension, usuario, clave,
descripcion, en el campo clave puede contener NULL o algún valor, pero
si introduzco un valor a este campo necesito que sea único y mi problema
radica en que cuando quiero hacer una actualización de determinado
registro ha algún otro campo que no sea el campo clave no me permite
hacer la actualización ya que la clave ya existe y no me permite hacer
el update, como puedo solucionar este problema de validación?

a continuación expongo el sp que utilizo para el update.


CREATE PROCEDURE dbo.sp_ModificaExtension
@id_extension int,
@usuario varchar (50),
@clave int,
@descripcion varchar (50),
@id_ccostos int,
@tipo_servicio varchar (5),
@desc_tipo_servicio varchar (50),
@id_ext int

AS
DECLARE @ErrorSave INT
SET @ErrorSave = 0

IF NOT EXISTS (select clave from extension where clave=@clave)
BEGIN
UPDATE extension SET
id_extension=@id_extension,
usuario=@usuario,
clave=@clave,
descripcion=@descripcion,
id_ccostos=@id_ccostos,
tipo_servicio= @tipo_servicio,
desc_tipo_servicio=@desc_tipo_servicio
WHERE id_extension=@id_ext
END

IF (@@ERROR <> 0) --Si hay error
SET @ErrorSave = @@ERROR
GO

Muchas gracias por cualquier ayuda.

Respuesta Responder a este mensaje
#2 Omar
09/03/2006 - 19:06 | Informe spam
Que tal Alejandro, muchas gracias por ayudarme, ahora solo un favorsote

me puedes explicar la siguiente línea de código por favor, por que no
entiendo, esto resuelve mi problema pero no me queda claro que es lo que
se hace.

c3 as case when c2 is null then ltrim(c1) else c2 end unique

Muchas gracias, nuevamente.



Alejandro Mesa escribió:
Omar,

Siempre recomiendo que para este tipo de preguntas se postee la estructura
de la tabla. Cual es la clva eprimaria de esta tabla?

Existen varias formas de forzar valores unicos en un columna que permite
null, la una mediante una vista indexada y la otra mediante el uso de una
columna calculada (esta version me gusta mas).

Ejemplo:

create table t1(
c1 int not null identity unique,
c2 varchar(10) null,
c3 as case when c2 is null then ltrim(c1) else c2 end unique
)
go

insert into t1 default values
insert into t1 default values
go

insert into t1(c2) values('a')
insert into t1(c2) values('b')
go

insert into t1 default values
insert into t1 default values
go

select *
from t1

update t1
set c2 = 'a'
where c1 = 4
go

select *
from t1
go

drop table t1
go


AMB


"Omar" wrote:

Que tal buen día, nuevamente recurro a ustedes ya que se me presentó el
siguiente problema.

Tengo una tabla con los siguientes campos id_extension, usuario, clave,
descripcion, en el campo clave puede contener NULL o algún valor, pero
si introduzco un valor a este campo necesito que sea único y mi problema
radica en que cuando quiero hacer una actualización de determinado
registro ha algún otro campo que no sea el campo clave no me permite
hacer la actualización ya que la clave ya existe y no me permite hacer
el update, como puedo solucionar este problema de validación?

a continuación expongo el sp que utilizo para el update.


CREATE PROCEDURE dbo.sp_ModificaExtension
@id_extension int,
@usuario varchar (50),
@clave int,
@descripcion varchar (50),
@id_ccostos int,
@tipo_servicio varchar (5),
@desc_tipo_servicio varchar (50),
@id_ext int

AS
DECLARE @ErrorSave INT
SET @ErrorSave = 0

IF NOT EXISTS (select clave from extension where clave=@clave)
BEGIN
UPDATE extension SET
id_extension=@id_extension,
usuario=@usuario,
clave=@clave,
descripcion=@descripcion,
id_ccostos=@id_ccostos,
tipo_servicio= @tipo_servicio,
desc_tipo_servicio=@desc_tipo_servicio
WHERE id_extension=@id_ext
END

IF (@@ERROR <> 0) --Si hay error
SET @ErrorSave = @@ERROR
GO

Muchas gracias por cualquier ayuda.

Respuesta Responder a este mensaje
#3 Alejandro Mesa
09/03/2006 - 20:08 | Informe spam
Omar,

me puedes explicar la siguiente línea de código por favor, por que no
entiendo, esto resuelve mi problema pero no me queda claro que es lo que
se hace.



Con mucho gusto. Esta expresion lo que hace es usar el valor de la clave
primaria (valor que por definicion no puede ser duplicado) cuando el valor en
la columna c2 es null, de lo contrario usa el valor de la columna c2. Como el
valor de la clave primaria nunca sera duplicado, entoncesla restriccion sera
aplicada para los valores no null de c2.

Fijate en el valor de la columna c3 cuando haces el select.

1 null 1
2 null 2
3 a 3
4 b 3

Si tratas de actualizar la columna c2 y ponerle 'a' para c1 = 4, entonces
tendriamos dos filas con valor 'a' en la columna c2 y eso es lo que la
restriccion de unicidad evita.


AMB

"Omar" wrote:

Que tal Alejandro, muchas gracias por ayudarme, ahora solo un favorsote

me puedes explicar la siguiente línea de código por favor, por que no
entiendo, esto resuelve mi problema pero no me queda claro que es lo que
se hace.

c3 as case when c2 is null then ltrim(c1) else c2 end unique

Muchas gracias, nuevamente.



Alejandro Mesa escribió:
> Omar,
>
> Siempre recomiendo que para este tipo de preguntas se postee la estructura
> de la tabla. Cual es la clva eprimaria de esta tabla?
>
> Existen varias formas de forzar valores unicos en un columna que permite
> null, la una mediante una vista indexada y la otra mediante el uso de una
> columna calculada (esta version me gusta mas).
>
> Ejemplo:
>
> create table t1(
> c1 int not null identity unique,
> c2 varchar(10) null,
> c3 as case when c2 is null then ltrim(c1) else c2 end unique
> )
> go
>
> insert into t1 default values
> insert into t1 default values
> go
>
> insert into t1(c2) values('a')
> insert into t1(c2) values('b')
> go
>
> insert into t1 default values
> insert into t1 default values
> go
>
> select *
> from t1
>
> update t1
> set c2 = 'a'
> where c1 = 4
> go
>
> select *
> from t1
> go
>
> drop table t1
> go
>
>
> AMB
>
>
> "Omar" wrote:
>
>> Que tal buen día, nuevamente recurro a ustedes ya que se me presentó el
>> siguiente problema.
>>
>> Tengo una tabla con los siguientes campos id_extension, usuario, clave,
>> descripcion, en el campo clave puede contener NULL o algún valor, pero
>> si introduzco un valor a este campo necesito que sea único y mi problema
>> radica en que cuando quiero hacer una actualización de determinado
>> registro ha algún otro campo que no sea el campo clave no me permite
>> hacer la actualización ya que la clave ya existe y no me permite hacer
>> el update, como puedo solucionar este problema de validación?
>>
>> a continuación expongo el sp que utilizo para el update.
>>
>>
>> CREATE PROCEDURE dbo.sp_ModificaExtension
>> @id_extension int,
>> @usuario varchar (50),
>> @clave int,
>> @descripcion varchar (50),
>> @id_ccostos int,
>> @tipo_servicio varchar (5),
>> @desc_tipo_servicio varchar (50),
>> @id_ext int
>>
>> AS
>> DECLARE @ErrorSave INT
>> SET @ErrorSave = 0
>>
>> IF NOT EXISTS (select clave from extension where clave=@clave)
>> BEGIN
>> UPDATE extension SET
>> id_extension=@id_extension,
>> usuario=@usuario,
>> clave=@clave,
>> descripcion=@descripcion,
>> id_ccostos=@id_ccostos,
>> tipo_servicio= @tipo_servicio,
>> desc_tipo_servicio=@desc_tipo_servicio
>> WHERE id_extension=@id_ext
>> END
>>
>> IF (@@ERROR <> 0) --Si hay error
>> SET @ErrorSave = @@ERROR
>> GO
>>
>> Muchas gracias por cualquier ayuda.
>>

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