Restricciones CHECK

24/08/2006 - 16:40 por José Redondo | Informe spam
Hola foro.

Alguién podría comentarme e indicarme como se haría lo siguiente en SQL
Server 2005:

Tengo varias columnas de NChar y NVarchar donde me van almacenar por ejemplo
datos como (Edad, CodigoTelefono, NumeroTelefono, NumeroCedulaIdentidad,
etc.).

Requiero una Restricción Check donde solamente se me admitan números y no
caracteres "letras, signos de puntuación, etc"; ya que quiero garantizar por
Base de Datos que dentro de este tipo de columna con este tipo de datos sólo
existan caracteres numericos.

Quién tendría una orientación al respecto o en caso contrario, guiarme haber
como hago eso.

Gracias por la guia y salu2 a todos desde Venezuela.

RedondoJ

Preguntas similare

Leer las respuestas

#6 Isaias
24/08/2006 - 19:02 | Informe spam
Excelentes todas y cada una de las explicaciones, yo solo le preguntaria a
José, ¿Porque querer guardar datos en un VARCHAR como NUMEROS, FECHAS, etc?

Saludos
Saludos
IIslas


"Alejandro Mesa" wrote:

Eladio Rincón,

Si el comportamiento de la funcion ISNUMERIC cambio en 2005, entonces es
valido. En SQL Server 2000, esta funcion devueve 1 cuando el parametro que se
pasa esta formato cientifico.

Ejemplo:

select isnumeric('2E2')
go

Resultado:

1

Asi que el uso de esta funcion no garantiza que no se pase caracteres que no
sean digitos entre 0 y 9. Una forma de hacer esto seria negando la igualdad
con una cadena que contenga cualquier caracter que no sea digito.

create table #t1 (
c1 varchar(10) null constraint ck_#t1_c1 check (c1 not like '%[^0-9]%')
)
go

insert into #t1 values(1)
go

insert into #t1 values('2E10')
go

select * from #t1
go

drop table #t1
go


Saludos,

Alejandro Mesa




"Eladio Rincón" wrote:

> mira si este ejemplo te sirve:
>
> use tempdb
> go
> drop table dbo.t
> go
> create table dbo.t (id int, v nchar(30))
> go
> alter table dbo.t
> add constraint check_v check ( isnumeric(v) = 1 )
> go
> insert dbo.t select 1, 'aaa'
> go
> insert dbo.t select 1, 12312322.12312
> go
> select * from dbo.t
>
>
> De todas formas, si sabes qeu va a ser numérico, usaría una columna de tipo
> numerico (numeric, decimal, money, int, bigint...)
>
>
>
> Eladio Rincón,
> http://www.siquelnet.com
>
> "José Redondo" <José wrote in message
> news:
> > Hola foro.
> >
> > Alguién podría comentarme e indicarme como se haría lo siguiente en SQL
> > Server 2005:
> >
> > Tengo varias columnas de NChar y NVarchar donde me van almacenar por
> > ejemplo
> > datos como (Edad, CodigoTelefono, NumeroTelefono, NumeroCedulaIdentidad,
> > etc.).
> >
> > Requiero una Restricción Check donde solamente se me admitan números y no
> > caracteres "letras, signos de puntuación, etc"; ya que quiero garantizar
> > por
> > Base de Datos que dentro de este tipo de columna con este tipo de datos
> > sólo
> > existan caracteres numericos.
> >
> > Quién tendría una orientación al respecto o en caso contrario, guiarme
> > haber
> > como hago eso.
> >
> > Gracias por la guia y salu2 a todos desde Venezuela.
> >
> > RedondoJ
> >
> >
> >
>
>
>
Respuesta Responder a este mensaje
#7 jcac
24/08/2006 - 19:10 | Informe spam
Disculpa Eladio,

No me hice entender muy bien, lo que te indicaba era que si coloco la
restricción que me indicas puedo insertar en la columna el valor ',' (coma)
asi como el valor '.' (punto), lo cual no se si sea correcto, espero haberme
hecho entender y perdon por hacerte perder el tiempo.

Saludos


"Eladio Rincón" escribió en el mensaje
news:
Hola,

no se si he comprendido la pregunta; corrigeme si me equivoco;

si quieres evitar puntos, y comas, podrías añadir:

alter table dbo.t
add constraint check_v check (
isnumeric(v) = 1
and charindex (',', v) = 0
and charindex ('.', v) = 0
)

Sigo opinando que habría que convertir la columna a tipo numérico, entero,
...

Bye,

Eladio Rincón,
http://www.siquelnet.com


"jcac" wrote in message
news:
Perdon RedondoJ, pero una consulta Eladio, si bien realice una prueba con
lo que dices y puedo insertar el caracter ',' (coma) tambien el '.'
(punto) solos esto seria correcto.

Saludos


"Eladio Rincón" escribió en el mensaje
news:
mira si este ejemplo te sirve:

use tempdb
go
drop table dbo.t
go
create table dbo.t (id int, v nchar(30))
go
alter table dbo.t
add constraint check_v check ( isnumeric(v) = 1 )
go
insert dbo.t select 1, 'aaa'
go
insert dbo.t select 1, 12312322.12312
go
select * from dbo.t


De todas formas, si sabes qeu va a ser numérico, usaría una columna de
tipo numerico (numeric, decimal, money, int, bigint...)



Eladio Rincón,
http://www.siquelnet.com

"José Redondo" <José wrote in message
news:
Hola foro.

Alguién podría comentarme e indicarme como se haría lo siguiente en SQL
Server 2005:

Tengo varias columnas de NChar y NVarchar donde me van almacenar por
ejemplo
datos como (Edad, CodigoTelefono, NumeroTelefono,
NumeroCedulaIdentidad,
etc.).

Requiero una Restricción Check donde solamente se me admitan números y
no
caracteres "letras, signos de puntuación, etc"; ya que quiero
garantizar por
Base de Datos que dentro de este tipo de columna con este tipo de datos
sólo
existan caracteres numericos.

Quién tendría una orientación al respecto o en caso contrario, guiarme
haber
como hago eso.

Gracias por la guia y salu2 a todos desde Venezuela.

RedondoJ















Respuesta Responder a este mensaje
#8 Alejandro Mesa
24/08/2006 - 19:11 | Informe spam
Isaias,

No se cuales seran las necesidades de José, pero por ejemplo, aca tenemos el
# de seguro social, que es una forma de identificacion del ciudadano y esta
formado solo por numeros. Como no realizamos ningun tipo de operacion
matematica con estos numeros y como ademas tambien se permite que algunos de
ellos tengan ceros a la izquierda, entonces lo representamos en cadenas de
caracteres.

En el caso de las fechas, bueno eso si tendra que responderlo José.

Saludos,

AMB


"Isaias" wrote:

Excelentes todas y cada una de las explicaciones, yo solo le preguntaria a
José, ¿Porque querer guardar datos en un VARCHAR como NUMEROS, FECHAS, etc?

Saludos
Saludos
IIslas


"Alejandro Mesa" wrote:

> Eladio Rincón,
>
> Si el comportamiento de la funcion ISNUMERIC cambio en 2005, entonces es
> valido. En SQL Server 2000, esta funcion devueve 1 cuando el parametro que se
> pasa esta formato cientifico.
>
> Ejemplo:
>
> select isnumeric('2E2')
> go
>
> Resultado:
>
> 1
>
> Asi que el uso de esta funcion no garantiza que no se pase caracteres que no
> sean digitos entre 0 y 9. Una forma de hacer esto seria negando la igualdad
> con una cadena que contenga cualquier caracter que no sea digito.
>
> create table #t1 (
> c1 varchar(10) null constraint ck_#t1_c1 check (c1 not like '%[^0-9]%')
> )
> go
>
> insert into #t1 values(1)
> go
>
> insert into #t1 values('2E10')
> go
>
> select * from #t1
> go
>
> drop table #t1
> go
>
>
> Saludos,
>
> Alejandro Mesa
>
>
>
>
> "Eladio Rincón" wrote:
>
> > mira si este ejemplo te sirve:
> >
> > use tempdb
> > go
> > drop table dbo.t
> > go
> > create table dbo.t (id int, v nchar(30))
> > go
> > alter table dbo.t
> > add constraint check_v check ( isnumeric(v) = 1 )
> > go
> > insert dbo.t select 1, 'aaa'
> > go
> > insert dbo.t select 1, 12312322.12312
> > go
> > select * from dbo.t
> >
> >
> > De todas formas, si sabes qeu va a ser numérico, usaría una columna de tipo
> > numerico (numeric, decimal, money, int, bigint...)
> >
> >
> >
> > Eladio Rincón,
> > http://www.siquelnet.com
> >
> > "José Redondo" <José wrote in message
> > news:
> > > Hola foro.
> > >
> > > Alguién podría comentarme e indicarme como se haría lo siguiente en SQL
> > > Server 2005:
> > >
> > > Tengo varias columnas de NChar y NVarchar donde me van almacenar por
> > > ejemplo
> > > datos como (Edad, CodigoTelefono, NumeroTelefono, NumeroCedulaIdentidad,
> > > etc.).
> > >
> > > Requiero una Restricción Check donde solamente se me admitan números y no
> > > caracteres "letras, signos de puntuación, etc"; ya que quiero garantizar
> > > por
> > > Base de Datos que dentro de este tipo de columna con este tipo de datos
> > > sólo
> > > existan caracteres numericos.
> > >
> > > Quién tendría una orientación al respecto o en caso contrario, guiarme
> > > haber
> > > como hago eso.
> > >
> > > Gracias por la guia y salu2 a todos desde Venezuela.
> > >
> > > RedondoJ
> > >
> > >
> > >
> >
> >
> >
Respuesta Responder a este mensaje
#9 José Redondo
24/08/2006 - 19:18 | Informe spam
Haber foro y les comento el contexto:

En el diseño de la misma decidi establecer que los valores númericos de
estas columnas fueran NChar y NVarchar con el fin de que no voy a generar
ningún calculo con esos datos (lease: Edad, CodigoTelefono, NumeroTelefono,
NumeroCedulaIdentidad, NumeroSeguroSocial, etc), por ende estableci que al
almacenarlos en columna Alfanumericas por asi decirlo, solamente permitiendo
que en ellos me almacene los datos dentro del rango de caracteres (0-9) nada
mas y NO PERMITIRME INGRESARLES DATOS (A-Z) nada mas.

Considero que el fin es optimo, aunque soy consiente que desde la aplicación
cliente puedo manipular esta restricción, prefiero a modo de tener una
integridad de datos mas optima utilizarlos asi y tener lo mas pulcra la
información alamcenada dentro de la base de datos. Ahora, por la experiencia
que algunos de ustedes puedan tener como desarrolladores, consulte lo que he
expuesto.

Cual función o expresión definirian ustedes para el contexto anteriormente
explicado.

Gracias,

JR

"Isaias" wrote:

Excelentes todas y cada una de las explicaciones, yo solo le preguntaria a
José, ¿Porque querer guardar datos en un VARCHAR como NUMEROS, FECHAS, etc?

Saludos
Saludos
IIslas


"Alejandro Mesa" wrote:

> Eladio Rincón,
>
> Si el comportamiento de la funcion ISNUMERIC cambio en 2005, entonces es
> valido. En SQL Server 2000, esta funcion devueve 1 cuando el parametro que se
> pasa esta formato cientifico.
>
> Ejemplo:
>
> select isnumeric('2E2')
> go
>
> Resultado:
>
> 1
>
> Asi que el uso de esta funcion no garantiza que no se pase caracteres que no
> sean digitos entre 0 y 9. Una forma de hacer esto seria negando la igualdad
> con una cadena que contenga cualquier caracter que no sea digito.
>
> create table #t1 (
> c1 varchar(10) null constraint ck_#t1_c1 check (c1 not like '%[^0-9]%')
> )
> go
>
> insert into #t1 values(1)
> go
>
> insert into #t1 values('2E10')
> go
>
> select * from #t1
> go
>
> drop table #t1
> go
>
>
> Saludos,
>
> Alejandro Mesa
>
>
>
>
> "Eladio Rincón" wrote:
>
> > mira si este ejemplo te sirve:
> >
> > use tempdb
> > go
> > drop table dbo.t
> > go
> > create table dbo.t (id int, v nchar(30))
> > go
> > alter table dbo.t
> > add constraint check_v check ( isnumeric(v) = 1 )
> > go
> > insert dbo.t select 1, 'aaa'
> > go
> > insert dbo.t select 1, 12312322.12312
> > go
> > select * from dbo.t
> >
> >
> > De todas formas, si sabes qeu va a ser numérico, usaría una columna de tipo
> > numerico (numeric, decimal, money, int, bigint...)
> >
> >
> >
> > Eladio Rincón,
> > http://www.siquelnet.com
> >
> > "José Redondo" <José wrote in message
> > news:
> > > Hola foro.
> > >
> > > Alguién podría comentarme e indicarme como se haría lo siguiente en SQL
> > > Server 2005:
> > >
> > > Tengo varias columnas de NChar y NVarchar donde me van almacenar por
> > > ejemplo
> > > datos como (Edad, CodigoTelefono, NumeroTelefono, NumeroCedulaIdentidad,
> > > etc.).
> > >
> > > Requiero una Restricción Check donde solamente se me admitan números y no
> > > caracteres "letras, signos de puntuación, etc"; ya que quiero garantizar
> > > por
> > > Base de Datos que dentro de este tipo de columna con este tipo de datos
> > > sólo
> > > existan caracteres numericos.
> > >
> > > Quién tendría una orientación al respecto o en caso contrario, guiarme
> > > haber
> > > como hago eso.
> > >
> > > Gracias por la guia y salu2 a todos desde Venezuela.
> > >
> > > RedondoJ
> > >
> > >
> > >
> >
> >
> >
Respuesta Responder a este mensaje
#10 José Redondo
24/08/2006 - 19:23 | Informe spam
Haber foro y les comento el contexto:

En el diseño de la misma decidi establecer que los valores númericos de
estas columnas fueran NChar y NVarchar con el fin de que no voy a generar
ningún calculo con esos datos (lease: Edad, CodigoTelefono, NumeroTelefono,
NumeroCedulaIdentidad, NumeroSeguroSocial, etc), por ende estableci que al
almacenarlos en columna Alfanumericas por asi decirlo, solamente permitiendo
que en ellos me almacene los datos dentro del rango de caracteres (0-9) nada
mas y NO PERMITIRME INGRESARLES DATOS (A-Z) nada mas.

Considero que el fin es optimo, aunque soy consiente que desde la aplicación
cliente puedo manipular esta restricción, prefiero a modo de tener una
integridad de datos mas optima utilizarlos asi y tener lo mas pulcra la
información alamcenada dentro de la base de datos. Ahora, por la experiencia
que algunos de ustedes puedan tener como desarrolladores, consulte lo que he
expuesto.

Cual función o expresión definirian ustedes para el contexto anteriormente
explicado.

Gracias,

JR

"Isaias" wrote:

Excelentes todas y cada una de las explicaciones, yo solo le preguntaria a
José, ¿Porque querer guardar datos en un VARCHAR como NUMEROS, FECHAS, etc?

Saludos
Saludos
IIslas


"Alejandro Mesa" wrote:

> Eladio Rincón,
>
> Si el comportamiento de la funcion ISNUMERIC cambio en 2005, entonces es
> valido. En SQL Server 2000, esta funcion devueve 1 cuando el parametro que se
> pasa esta formato cientifico.
>
> Ejemplo:
>
> select isnumeric('2E2')
> go
>
> Resultado:
>
> 1
>
> Asi que el uso de esta funcion no garantiza que no se pase caracteres que no
> sean digitos entre 0 y 9. Una forma de hacer esto seria negando la igualdad
> con una cadena que contenga cualquier caracter que no sea digito.
>
> create table #t1 (
> c1 varchar(10) null constraint ck_#t1_c1 check (c1 not like '%[^0-9]%')
> )
> go
>
> insert into #t1 values(1)
> go
>
> insert into #t1 values('2E10')
> go
>
> select * from #t1
> go
>
> drop table #t1
> go
>
>
> Saludos,
>
> Alejandro Mesa
>
>
>
>
> "Eladio Rincón" wrote:
>
> > mira si este ejemplo te sirve:
> >
> > use tempdb
> > go
> > drop table dbo.t
> > go
> > create table dbo.t (id int, v nchar(30))
> > go
> > alter table dbo.t
> > add constraint check_v check ( isnumeric(v) = 1 )
> > go
> > insert dbo.t select 1, 'aaa'
> > go
> > insert dbo.t select 1, 12312322.12312
> > go
> > select * from dbo.t
> >
> >
> > De todas formas, si sabes qeu va a ser numérico, usaría una columna de tipo
> > numerico (numeric, decimal, money, int, bigint...)
> >
> >
> >
> > Eladio Rincón,
> > http://www.siquelnet.com
> >
> > "José Redondo" <José wrote in message
> > news:
> > > Hola foro.
> > >
> > > Alguién podría comentarme e indicarme como se haría lo siguiente en SQL
> > > Server 2005:
> > >
> > > Tengo varias columnas de NChar y NVarchar donde me van almacenar por
> > > ejemplo
> > > datos como (Edad, CodigoTelefono, NumeroTelefono, NumeroCedulaIdentidad,
> > > etc.).
> > >
> > > Requiero una Restricción Check donde solamente se me admitan números y no
> > > caracteres "letras, signos de puntuación, etc"; ya que quiero garantizar
> > > por
> > > Base de Datos que dentro de este tipo de columna con este tipo de datos
> > > sólo
> > > existan caracteres numericos.
> > >
> > > Quién tendría una orientación al respecto o en caso contrario, guiarme
> > > haber
> > > como hago eso.
> > >
> > > Gracias por la guia y salu2 a todos desde Venezuela.
> > >
> > > RedondoJ
> > >
> > >
> > >
> >
> >
> >
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida