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

#11 José Redondo
24/08/2006 - 19:43 | Informe spam
Un aclaración IMPORTANTE:

Las consultas que he estado exponiendo en ningún momento pregunto sobre
FECHAS u otro tipo de información. ME REFIERO UNICAMENTE A TIPOS DE DATOS
NChar y NVarchar para almacenar SOLAMENTE DIGITOS NUMERICOS Y NO LETRAS,
SIGNOS DE PUNTUACIÓN Y DEMAS, mas nada.

Espero que con esta aclaración no se me desvien del punto a tratar.

Gracias por su inmensa colaboración compañeros del foro.

Un millón de gracias.

Salu2,

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
#12 Isaias
24/08/2006 - 23:37 | Informe spam
Bueno, excelente explicación, pero si tomamos en cuenta la regla de que el
99.99% de las validaciones se deben hacer en el front, pues estas estarian en
al primera capa.

En la base, las validaciones las haria en los STORES PROCEDURES.

Si, ya lo se, tal vez existan ingresos masivos de informacion (BULK INSERT,
BCP, etc), ahi si para que veas, habria que colocar los CHECK en las columnas.
Saludos
IIslas


"Alejandro Mesa" wrote:

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
#13 Miguel Egea
25/08/2006 - 10:00 | Informe spam
José, muchas veces los desarrolladores tenemos un espíritu que nos hace
ponernos todo en cuestión, eso es realmente bueno, pero en ocasiones nos
lleva a errores, en mi opinión y si admites un consejo, yo reconsideraría
esa decisión, desde el punto de vista de rendimiento un int puede almacenar
números desde -2,147,483,648 hasta 2,147,483,647 que como puedes comprobar,
aún si quitamos las comas ocuparan en tu base de datos 10 bytes, más el que
ocupa el varchar para medir la distancia desde el fin de la página al menos
11 bytes, mientras que un entero ocupa 4, pero esto además va a todos los
índices, restricciones, campos calculados, etc. Si tienes que garantizar que
algo es un número la mejor solución es meterlo en un campo numérico. Dicho
esto (que creo que estaba en la obligación de decirtelo), también he creado
un script que debiera solucionar tu problema, es solo válido para 2005, pero
la idea es perfectamente extrapolable a SQL Server 2000. Lo voy a publicar
también en portalSQL.

CREATE FUNCTION SoloNumeros(@a varchar(100))

RETURNS bit

AS

BEGIN


Declare @sol bit

Set @Sol=1 ;-- Por defecto está bien

WITH MyCTE(id) AS

(

SELECT 1 as id

UNION ALL

SELECT id+1 FROM MyCTE WHERE id<len(@a)

)

SELECT @SolÊSE WHEN substring(@a,id,1) not like '[0-9]' THEN 0 ELSE @Sol
END

from MyCTE OPTION (MAXRECURSION 0 );


RETURN @SOL

END

GO

DROP TABLE #TEMP

create table #temp (a varchar(5) check (dbo.SoloNumeros(a)=1))

insert into #temp values ('A0203')

insert into #temp values ('0203')



Saludos Cordiales

Miguel Egea




"José Redondo" <José wrote in message
news:
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
#14 Alejandro Mesa
25/08/2006 - 14:21 | Informe spam
Hola Miguel,

1 - Como hacemos en caso de que este # requiera ceros a la izquierda?

2 - Has considerado usar el operador LIKE para alcanzar el mismo resultado,
sin necesidad de un lazo que recorra la cadena?

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


Saludos,

AMB

"Miguel Egea" wrote:

José, muchas veces los desarrolladores tenemos un espíritu que nos hace
ponernos todo en cuestión, eso es realmente bueno, pero en ocasiones nos
lleva a errores, en mi opinión y si admites un consejo, yo reconsideraría
esa decisión, desde el punto de vista de rendimiento un int puede almacenar
números desde -2,147,483,648 hasta 2,147,483,647 que como puedes comprobar,
aún si quitamos las comas ocuparan en tu base de datos 10 bytes, más el que
ocupa el varchar para medir la distancia desde el fin de la página al menos
11 bytes, mientras que un entero ocupa 4, pero esto además va a todos los
índices, restricciones, campos calculados, etc. Si tienes que garantizar que
algo es un número la mejor solución es meterlo en un campo numérico. Dicho
esto (que creo que estaba en la obligación de decirtelo), también he creado
un script que debiera solucionar tu problema, es solo válido para 2005, pero
la idea es perfectamente extrapolable a SQL Server 2000. Lo voy a publicar
también en portalSQL.

CREATE FUNCTION SoloNumeros(@a varchar(100))

RETURNS bit

AS

BEGIN


Declare @sol bit

Set @Sol=1 ;-- Por defecto está bien

WITH MyCTE(id) AS

(

SELECT 1 as id

UNION ALL

SELECT id+1 FROM MyCTE WHERE id<len(@a)

)

SELECT @SolÊSE WHEN substring(@a,id,1) not like '[0-9]' THEN 0 ELSE @Sol
END

from MyCTE OPTION (MAXRECURSION 0 );


RETURN @SOL

END

GO

DROP TABLE #TEMP

create table #temp (a varchar(5) check (dbo.SoloNumeros(a)=1))

insert into #temp values ('A0203')

insert into #temp values ('0203')



Saludos Cordiales

Miguel Egea




"José Redondo" <José wrote in message
news:
> 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
#15 Miguel Egea
28/08/2006 - 08:51 | Informe spam
1.- Obviamente dependerá del caso, si el tema de los ceros a la izquierda es
meramente para presentación yo delegaría eso a la capa de presentación, en
otras ocasiones, pues no quedará otra que meterlo en un varchar.
2.- La verdad es que se me escapó la más sencilla, siguiendo el hilo entero
y viendo todas las respuestas solo se me ocurrió hacer una udf, gracias por
hacerlo más fácil.

Saludos
"Alejandro Mesa" wrote in message
news:
Hola Miguel,

1 - Como hacemos en caso de que este # requiera ceros a la izquierda?

2 - Has considerado usar el operador LIKE para alcanzar el mismo
resultado,
sin necesidad de un lazo que recorra la cadena?

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


Saludos,

AMB

"Miguel Egea" wrote:

José, muchas veces los desarrolladores tenemos un espíritu que nos hace
ponernos todo en cuestión, eso es realmente bueno, pero en ocasiones nos
lleva a errores, en mi opinión y si admites un consejo, yo reconsideraría
esa decisión, desde el punto de vista de rendimiento un int puede
almacenar
números desde -2,147,483,648 hasta 2,147,483,647 que como puedes
comprobar,
aún si quitamos las comas ocuparan en tu base de datos 10 bytes, más el
que
ocupa el varchar para medir la distancia desde el fin de la página al
menos
11 bytes, mientras que un entero ocupa 4, pero esto además va a todos los
índices, restricciones, campos calculados, etc. Si tienes que garantizar
que
algo es un número la mejor solución es meterlo en un campo numérico.
Dicho
esto (que creo que estaba en la obligación de decirtelo), también he
creado
un script que debiera solucionar tu problema, es solo válido para 2005,
pero
la idea es perfectamente extrapolable a SQL Server 2000. Lo voy a
publicar
también en portalSQL.

CREATE FUNCTION SoloNumeros(@a varchar(100))

RETURNS bit

AS

BEGIN


Declare @sol bit

Set @Sol=1 ;-- Por defecto está bien

WITH MyCTE(id) AS

(

SELECT 1 as id

UNION ALL

SELECT id+1 FROM MyCTE WHERE id<len(@a)

)

SELECT @SolÊSE WHEN substring(@a,id,1) not like '[0-9]' THEN 0 ELSE
@Sol
END

from MyCTE OPTION (MAXRECURSION 0 );


RETURN @SOL

END

GO

DROP TABLE #TEMP

create table #temp (a varchar(5) check (dbo.SoloNumeros(a)=1))

insert into #temp values ('A0203')

insert into #temp values ('0203')



Saludos Cordiales

Miguel Egea




"José Redondo" <José wrote in message
news:
> 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
>> > > >
>> > > >
>> > > >
>> > >
>> > >
>> > >



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