Tratamiento de IPs con SQL Server

29/10/2004 - 13:53 por Jorge Serrano [MVP VB] | Informe spam
Hola a to2,

aquí planteo mi duda para ver si alguien me puede echar un poco de luz al
tema.

Tengo una IP Origen del tipo 192.168.2.32 por ejemplo y un rango de IPs
inicial y final del tipo 192.168.002.001 y 192.168.002.041.

Lo que quiero es saber si la IP Origen está dentro o no del rango de IPs,
para lo cuál se me ocurren dos alternativas (estos datos debo cruzarlos entre
dos tablas dónde otro campo Fecha también tiene su importancia, pero que
ahora no voy a sacarlo a relucir).

Estas alternativas serían;

1) La IP Origen formatearla para dejarla como 192.168.002.032 y compararla,
pero ¿esto funcionaría correctamente?.
Por eso y para posiblemente solucionar esto, se me ocurre esto otro.

Ejecutando esta instrucción:
SELECT PARSENAME(IP, 4) +
PARSENAME(IP, 3) +
PARSENAME(IP, 2) +
PARSENAME(IP, 1) as IP
FROM TABLA
Obtendría una IP del tipo: 192168232, pero me gustaría obtenerla como
192168002032 para poder compararla posteriormente con las IPs 192168002001 y
192168002041. Así podría ver si se encuentra dentro del rango >= y <=.


2) Obtener el rango de inicio y fin; 192.168.002.001 y 192.168.002.041 y
crear las IPs intermedias (lista de IPs para hacer el IN en la tabla, lista
del tipo 192.168.002.001, 192.168.002.002, ..., 192.168.002.040 y
192.168.002.041


Bueno, como véis tengo estas alternativas, por lo que si alguien pudiera
darme luz al respecto y decirme qué o cómo podría hacerlo de una forma
adecuada, mucho mejor.


Muchas gracias.

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Weblog de Jorge Serrano
http://weblogs.golemproject.com/jorge/

Preguntas similare

Leer las respuestas

#1 Maxi
29/10/2004 - 14:18 | Informe spam
Hola jorge!! un gusto poder ayudarte :-)

A ver, porque no hacer un LEFT para poder sacar la red?




Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Jorge Serrano [MVP VB]"
escribió
en el mensaje news:
Hola a to2,

aquí planteo mi duda para ver si alguien me puede echar un poco de luz al
tema.

Tengo una IP Origen del tipo 192.168.2.32 por ejemplo y un rango de IPs
inicial y final del tipo 192.168.002.001 y 192.168.002.041.

Lo que quiero es saber si la IP Origen está dentro o no del rango de IPs,
para lo cuál se me ocurren dos alternativas (estos datos debo cruzarlos
entre
dos tablas dónde otro campo Fecha también tiene su importancia, pero que
ahora no voy a sacarlo a relucir).

Estas alternativas serían;

1) La IP Origen formatearla para dejarla como 192.168.002.032 y
compararla,
pero ¿esto funcionaría correctamente?.
Por eso y para posiblemente solucionar esto, se me ocurre esto otro.

Ejecutando esta instrucción:
SELECT PARSENAME(IP, 4) +
PARSENAME(IP, 3) +
PARSENAME(IP, 2) +
PARSENAME(IP, 1) as IP
FROM TABLA
Obtendría una IP del tipo: 192168232, pero me gustaría obtenerla como
192168002032 para poder compararla posteriormente con las IPs 192168002001
y
192168002041. Así podría ver si se encuentra dentro del rango >= y <=.


2) Obtener el rango de inicio y fin; 192.168.002.001 y 192.168.002.041 y
crear las IPs intermedias (lista de IPs para hacer el IN en la tabla,
lista
del tipo 192.168.002.001, 192.168.002.002, ..., 192.168.002.040 y
192.168.002.041


Bueno, como véis tengo estas alternativas, por lo que si alguien pudiera
darme luz al respecto y decirme qué o cómo podría hacerlo de una forma
adecuada, mucho mejor.


Muchas gracias.

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Weblog de Jorge Serrano
http://weblogs.golemproject.com/jorge/





Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.781 / Virus Database: 527 - Release Date: 21/10/2004
Respuesta Responder a este mensaje
#2 Jorge Serrano [MVP VB]
29/10/2004 - 14:36 | Informe spam
Hola Maxi, ;-)

muchas gracias!

Al final he sacado lo de la concatenación de esta forma:

SELECT CASE WHEN (LEN(PARSENAME(IP, 4)) < 3) THEN CASE WHEN
(LEN(PARSENAME(IP, 4)) = 2) THEN '0' ELSE '00' END ELSE '' END +
PARSENAME(IP, 4) +
CASE WHEN (LEN(PARSENAME(IP, 3)) < 3) THEN CASE WHEN (LEN(PARSENAME(IP, 3))
= 2) THEN '0' ELSE '00' END ELSE '' END +
PARSENAME(IP, 3) +
CASE WHEN (LEN(PARSENAME(IP, 2)) < 3) THEN CASE WHEN (LEN(PARSENAME(IP, 2))
= 2) THEN '0' ELSE '00' END ELSE '' END +
PARSENAME(IP, 2) +
CASE WHEN (LEN(PARSENAME(IP, 1)) < 3) THEN CASE WHEN (LEN(PARSENAME(IP, 1))
= 2) THEN '0' ELSE '00' END ELSE '' END +
PARSENAME(IP, 1) AS IP
FROM TABLA

Ahora tengo mi IP Origen del tipo 192168002032.

Ahora sólo tengo que cruzar estos datos. En principio, esta sería una de las
dos vías marcadas... la otra (y aunque con cualquier de estas vías me vale me
gustaría poder aprender cómo), sería que del rango de IPs marcado, me sacara
el resto de IPs que lo forma, es decir, que de
192.168.002.001 y 192.168.002.041 obtuviera una lista del tipo
192.168.002.001, 192.168.002.002, ..., 192.168.002.040 y 192.168.002.041. :-)

Muchas gracias Maxi! ;-)

Un abrazo,

Jorge





"Maxi" wrote:

Hola jorge!! un gusto poder ayudarte :-)

A ver, porque no hacer un LEFT para poder sacar la red?




Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Jorge Serrano [MVP VB]"
escribió
en el mensaje news:
> Hola a to2,
>
> aquí planteo mi duda para ver si alguien me puede echar un poco de luz al
> tema.
>
> Tengo una IP Origen del tipo 192.168.2.32 por ejemplo y un rango de IPs
> inicial y final del tipo 192.168.002.001 y 192.168.002.041.
>
> Lo que quiero es saber si la IP Origen está dentro o no del rango de IPs,
> para lo cuál se me ocurren dos alternativas (estos datos debo cruzarlos
> entre
> dos tablas dónde otro campo Fecha también tiene su importancia, pero que
> ahora no voy a sacarlo a relucir).
>
> Estas alternativas serían;
>
> 1) La IP Origen formatearla para dejarla como 192.168.002.032 y
> compararla,
> pero ¿esto funcionaría correctamente?.
> Por eso y para posiblemente solucionar esto, se me ocurre esto otro.
>
> Ejecutando esta instrucción:
> SELECT PARSENAME(IP, 4) +
> PARSENAME(IP, 3) +
> PARSENAME(IP, 2) +
> PARSENAME(IP, 1) as IP
> FROM TABLA
> Obtendría una IP del tipo: 192168232, pero me gustaría obtenerla como
> 192168002032 para poder compararla posteriormente con las IPs 192168002001
> y
> 192168002041. Así podría ver si se encuentra dentro del rango >= y <=.
>
>
> 2) Obtener el rango de inicio y fin; 192.168.002.001 y 192.168.002.041 y
> crear las IPs intermedias (lista de IPs para hacer el IN en la tabla,
> lista
> del tipo 192.168.002.001, 192.168.002.002, ..., 192.168.002.040 y
> 192.168.002.041
>
>
> Bueno, como véis tengo estas alternativas, por lo que si alguien pudiera
> darme luz al respecto y decirme qué o cómo podría hacerlo de una forma
> adecuada, mucho mejor.
>
>
> Muchas gracias.
>
> Jorge Serrano Pérez
> Microsoft MVP VB.NET
> PortalVB.com
> http://www.portalvb.com/
> Weblog de Jorge Serrano
> http://weblogs.golemproject.com/jorge/



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.781 / Virus Database: 527 - Release Date: 21/10/2004



Respuesta Responder a este mensaje
#3 Gustavo Larriera [MVP]
29/10/2004 - 15:10 | Informe spam
Esta función puede serte de utilidad. Lo que hago allí es convertir una IP a
formato BIGINT nnnnnnnnnnnn

create function ip2int (@ip sysname) returns bigint
as
begin
return 1000000000*convert(bigint, parsename(@ip,4)) +
1000000*convert(bigint, parsename(@ip,3)) + 1000*convert(bigint,
parsename(@ip,2)) + convert(bigint, parsename(@ip,1))
end

select dbo.ip2int('192.168.24.1') -- retorna 192168024001



Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"Jorge Serrano [MVP VB]"
wrote in
message news:
Hola a to2,

aquí planteo mi duda para ver si alguien me puede echar un poco de luz al
tema.

Tengo una IP Origen del tipo 192.168.2.32 por ejemplo y un rango de IPs
inicial y final del tipo 192.168.002.001 y 192.168.002.041.

Lo que quiero es saber si la IP Origen está dentro o no del rango de IPs,
para lo cuál se me ocurren dos alternativas (estos datos debo cruzarlos
entre
dos tablas dónde otro campo Fecha también tiene su importancia, pero que
ahora no voy a sacarlo a relucir).

Estas alternativas serían;

1) La IP Origen formatearla para dejarla como 192.168.002.032 y
compararla,
pero ¿esto funcionaría correctamente?.
Por eso y para posiblemente solucionar esto, se me ocurre esto otro.

Ejecutando esta instrucción:
SELECT PARSENAME(IP, 4) +
PARSENAME(IP, 3) +
PARSENAME(IP, 2) +
PARSENAME(IP, 1) as IP
FROM TABLA
Obtendría una IP del tipo: 192168232, pero me gustaría obtenerla como
192168002032 para poder compararla posteriormente con las IPs 192168002001
y
192168002041. Así podría ver si se encuentra dentro del rango >= y <=.


2) Obtener el rango de inicio y fin; 192.168.002.001 y 192.168.002.041 y
crear las IPs intermedias (lista de IPs para hacer el IN en la tabla,
lista
del tipo 192.168.002.001, 192.168.002.002, ..., 192.168.002.040 y
192.168.002.041


Bueno, como véis tengo estas alternativas, por lo que si alguien pudiera
darme luz al respecto y decirme qué o cómo podría hacerlo de una forma
adecuada, mucho mejor.


Muchas gracias.

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Weblog de Jorge Serrano
http://weblogs.golemproject.com/jorge/
Respuesta Responder a este mensaje
#4 Jorge Serrano [MVP VB]
29/10/2004 - 15:18 | Informe spam
Muy útil Gustavo. :-)

Muchas gracias!!!

Jorge


"Gustavo Larriera [MVP]" wrote:

Esta función puede serte de utilidad. Lo que hago allí es convertir una IP a
formato BIGINT nnnnnnnnnnnn

create function ip2int (@ip sysname) returns bigint
as
begin
return 1000000000*convert(bigint, parsename(@ip,4)) +
1000000*convert(bigint, parsename(@ip,3)) + 1000*convert(bigint,
parsename(@ip,2)) + convert(bigint, parsename(@ip,1))
end

select dbo.ip2int('192.168.24.1') -- retorna 192168024001



Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"Jorge Serrano [MVP VB]"
wrote in
message news:
> Hola a to2,
>
> aquí planteo mi duda para ver si alguien me puede echar un poco de luz al
> tema.
>
> Tengo una IP Origen del tipo 192.168.2.32 por ejemplo y un rango de IPs
> inicial y final del tipo 192.168.002.001 y 192.168.002.041.
>
> Lo que quiero es saber si la IP Origen está dentro o no del rango de IPs,
> para lo cuál se me ocurren dos alternativas (estos datos debo cruzarlos
> entre
> dos tablas dónde otro campo Fecha también tiene su importancia, pero que
> ahora no voy a sacarlo a relucir).
>
> Estas alternativas serían;
>
> 1) La IP Origen formatearla para dejarla como 192.168.002.032 y
> compararla,
> pero ¿esto funcionaría correctamente?.
> Por eso y para posiblemente solucionar esto, se me ocurre esto otro.
>
> Ejecutando esta instrucción:
> SELECT PARSENAME(IP, 4) +
> PARSENAME(IP, 3) +
> PARSENAME(IP, 2) +
> PARSENAME(IP, 1) as IP
> FROM TABLA
> Obtendría una IP del tipo: 192168232, pero me gustaría obtenerla como
> 192168002032 para poder compararla posteriormente con las IPs 192168002001
> y
> 192168002041. Así podría ver si se encuentra dentro del rango >= y <=.
>
>
> 2) Obtener el rango de inicio y fin; 192.168.002.001 y 192.168.002.041 y
> crear las IPs intermedias (lista de IPs para hacer el IN en la tabla,
> lista
> del tipo 192.168.002.001, 192.168.002.002, ..., 192.168.002.040 y
> 192.168.002.041
>
>
> Bueno, como véis tengo estas alternativas, por lo que si alguien pudiera
> darme luz al respecto y decirme qué o cómo podría hacerlo de una forma
> adecuada, mucho mejor.
>
>
> Muchas gracias.
>
> Jorge Serrano Pérez
> Microsoft MVP VB.NET
> PortalVB.com
> http://www.portalvb.com/
> Weblog de Jorge Serrano
> http://weblogs.golemproject.com/jorge/



Respuesta Responder a este mensaje
#5 Salvador Ramos
29/10/2004 - 15:44 | Informe spam
Hola Jorge, me alegro de verte por aquí :-)

Otra alternativa, partiendo de que los tres primeros números son siempre
iguales, es extraer el último número y comprobar que está entre 1 y 41.

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net
¿ Te interesa participar en las reuniones
del grupo de Usuarios de SQL Server y .NET ?
Se harán en levante de España, (Alicante o Murcia)?

"Jorge Serrano [MVP VB]"
escribió
en el mensaje news:
Hola a to2,

aquí planteo mi duda para ver si alguien me puede echar un poco de luz al
tema.

Tengo una IP Origen del tipo 192.168.2.32 por ejemplo y un rango de IPs
inicial y final del tipo 192.168.002.001 y 192.168.002.041.

Lo que quiero es saber si la IP Origen está dentro o no del rango de IPs,
para lo cuál se me ocurren dos alternativas (estos datos debo cruzarlos


entre
dos tablas dónde otro campo Fecha también tiene su importancia, pero que
ahora no voy a sacarlo a relucir).

Estas alternativas serían;

1) La IP Origen formatearla para dejarla como 192.168.002.032 y


compararla,
pero ¿esto funcionaría correctamente?.
Por eso y para posiblemente solucionar esto, se me ocurre esto otro.

Ejecutando esta instrucción:
SELECT PARSENAME(IP, 4) +
PARSENAME(IP, 3) +
PARSENAME(IP, 2) +
PARSENAME(IP, 1) as IP
FROM TABLA
Obtendría una IP del tipo: 192168232, pero me gustaría obtenerla como
192168002032 para poder compararla posteriormente con las IPs 192168002001


y
192168002041. Así podría ver si se encuentra dentro del rango >= y <=.


2) Obtener el rango de inicio y fin; 192.168.002.001 y 192.168.002.041 y
crear las IPs intermedias (lista de IPs para hacer el IN en la tabla,


lista
del tipo 192.168.002.001, 192.168.002.002, ..., 192.168.002.040 y
192.168.002.041


Bueno, como véis tengo estas alternativas, por lo que si alguien pudiera
darme luz al respecto y decirme qué o cómo podría hacerlo de una forma
adecuada, mucho mejor.


Muchas gracias.

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Weblog de Jorge Serrano
http://weblogs.golemproject.com/jorge/
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida