SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Come trasformare un IP in un intero

Vi è mai capitato di dover salvare un indirizzo IP (IPv4)?
Come sapete un IP IPv4 è formato da quattro parti numeriche che vanno da 0 a 255 (1 byte) separate da un punto.
Se volessimo salvare l'informazione su una base dati SQL Server potremmo usare più campi (uno per ogni parte dell'IP) oppure una stringa.
Nel primo caso, pensare alle where su 4 campi e ad eventuali criteri di join diventa scomodo.
Nel secondo caso, il campo potrebbe tenere dai 7 (x.x.x.x) ai 15 caratteri (xxx.xxx.xxx.xxx), occupando fino ad un massimo di 15byte per IP.

Ma è possibile anche immagazzinarlo come un intero per far sì che l'occupazione si riduca a 4byte, semplificando la vita anche wui criteri di join e sulle where (comprese quelle sul range di IP, decisamente semplificate).
Come fare ad ottenere l'intero di un indirizzo IPv4? basta seguire questa semplice formula e, con SQL Server, utilizzare in aggiunta la PARSENAME function.
Con questa funzione infatti è possibile ricavare da un fully qualified name (formato <Server>.<Database>.<Schema>.<Object>) l'oggetto corrispondente alla posizione che, rispettivamente è 4.3.2.1. Osserviamo il seguente esempio:

DECLARE @ipString varchar(15) = '192.168.0.15'

DECLARE @IP1 int

DECLARE @IP2 int

DECLARE @IP3 int

DECLARE @IP4 int

 

-- distinguo i 4 valori

SELECT

        @IP1 = CONVERT(TINYINT, PARSENAME(@ipString, 4))

      , @IP2 = CONVERT(TINYINT, PARSENAME(@ipString, 3))

      , @IP3 = CONVERT(TINYINT, PARSENAME(@ipString, 2))

      , @IP4 = CONVERT(TINYINT, PARSENAME(@ipString, 1))

 

-- controllo se si tratta di valori di indirizzamento locale e applica le formule

IF @IP1 < 128

      SET @IP1 = @IP1 * 256 * 256 * 256

ELSE

      SET @IP1 = -(256 - @IP1) * 256 * 256 * 256

     

SET @IP2 = @IP2 * 256 * 256

SET @IP3 = @IP3 * 256

 

-- risultato

SELECT

      IPInteger = @IP1 + @IP2 + @IP3 + @IP4

     

/*

IPInteger

-----------

-1062731761

 

(1 row(s) affected)

*/

Spero possa tornarvi utile. Il link da cui ho preso questo procedimento è questo.

Stay tuned!

Categoria: Transact-SQL
mercoledì, 24 feb 2010 Ore. 20.18
Statistiche
  • Views Home Page: 600.667
  • Views Posts: 1.067.362
  • Views Gallerie: 641.165
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003