Accueil > > > SQL SERVER : CONVERSION IP EN CHAÎNE DE TEXTE VERS INTEGER ET INVERSE
SQL SERVER : CONVERSION IP EN CHAÎNE DE TEXTE VERS INTEGER ET INVERSE
Information sur la source
Description
Voici 2 fonctions permettant la conversion d'une chaîne de caractère contenant une adresse IP vers un int (Entier signé 32bits) en Transact-SQL. Et une autre fonction réalisant l'opération inverse.
Source
- CREATE FUNCTION dbo.ConvertIntToIp ( @AddrInt int )
- RETURNS varchar(15)
- BEGIN
-
- RETURN CAST(CAST(CAST(( @AddrInt & 0xFF000000 ) / 0x01000000 AS binary(1)) as tinyint) as varchar(3))
- + '.'
- + CAST(CAST(CAST(( @AddrInt & 0xFF0000 ) / 0x010000 AS binary(1)) as tinyint) as varchar(3))
- + '.'
- + CAST(CAST(CAST(( @AddrInt & 0xFF00 ) / 0x0100 AS binary(1)) as tinyint) as varchar(3))
- + '.'
- + CAST(CAST(CAST(( @AddrInt & 0xFF ) AS binary(1)) as tinyint) as varchar(3))
-
- END
- GO
-
-
-
- CREATE FUNCTION dbo.ConvertIpToInt ( @AddrIp varchar(15) )
- RETURNS int
- BEGIN
-
- DECLARE @first smallint
- DECLARE @second smallint
- DECLARE @third smallint
- DECLARE @fourth smallint
-
- DECLARE @result int
-
- DECLARE @test varchar(4)
-
- DECLARE @cur_loc tinyint
- DECLARE @last_loc tinyint
-
-
- -- Premier Bloc
- SET @cur_loc = CHARINDEX('.', @AddrIp)
- SET @test = LEFT(LEFT(@AddrIp, @cur_loc - 1), 3)
-
- IF PATINDEX('%[^0-9]%', @test) = 0
- BEGIN
- SET @first = CAST(@test AS smallint)
-
- -- Second Bloc
- SET @last_loc = @cur_loc + 1
- SET @cur_loc = CHARINDEX('.', @AddrIp, @last_loc)
- SET @test = LEFT(SUBSTRING(@AddrIp, @last_loc,
- @cur_loc - @last_loc), 3)
-
- IF PATINDEX('%[^0-9]%', @test) = 0
- BEGIN
- SET @second = CAST(@test AS smallint)
-
-
- -- Troisième Bloc
- SET @last_loc = @cur_loc + 1
- SET @cur_loc = CHARINDEX('.', @AddrIp, @last_loc)
- SET @test = LEFT(SUBSTRING(@AddrIp, @last_loc,
- @cur_loc - @last_loc), 3)
-
- IF PATINDEX('%[^0-9]%', @test) = 0
- BEGIN
- SET @third = CAST(@test AS smallint)
-
- -- Quatrième Bloc
- SET @last_loc = @cur_loc + 1
- SET @test = LEFT(SUBSTRING(@AddrIp, @last_loc,
- LEN(@AddrIp)
- - @last_loc + 1), 3)
-
- IF PATINDEX('%[^0-9]%', @test) = 0
- BEGIN
- SET @fourth = CAST(@test AS smallint)
- END
-
- END
-
- END
-
- END
-
- -- Résultat
- IF @first <= 255
- AND @second <= 255
- AND @third <= 255
- AND @fourth <= 255
- BEGIN
- IF @first <= 127
- SET @result = CAST(@first as int) * 0x1000000
- + CAST(@second as int) * 0x10000 + CAST(@third as int)
- * 0x100 + CAST(@fourth as int)
- ELSE
- SET @result = ( CAST(( @first & 0x7F ) as int) * 0x1000000
- + CAST(@second as int) * 0x10000
- + CAST(@third as int) * 0x100
- + CAST(@fourth as int) ) | 0x80000000
- END
-
- RETURN @result
-
- END
- GO
CREATE FUNCTION dbo.ConvertIntToIp ( @AddrInt int )
RETURNS varchar(15)
BEGIN
RETURN CAST(CAST(CAST(( @AddrInt & 0xFF000000 ) / 0x01000000 AS binary(1)) as tinyint) as varchar(3))
+ '.'
+ CAST(CAST(CAST(( @AddrInt & 0xFF0000 ) / 0x010000 AS binary(1)) as tinyint) as varchar(3))
+ '.'
+ CAST(CAST(CAST(( @AddrInt & 0xFF00 ) / 0x0100 AS binary(1)) as tinyint) as varchar(3))
+ '.'
+ CAST(CAST(CAST(( @AddrInt & 0xFF ) AS binary(1)) as tinyint) as varchar(3))
END
GO
CREATE FUNCTION dbo.ConvertIpToInt ( @AddrIp varchar(15) )
RETURNS int
BEGIN
DECLARE @first smallint
DECLARE @second smallint
DECLARE @third smallint
DECLARE @fourth smallint
DECLARE @result int
DECLARE @test varchar(4)
DECLARE @cur_loc tinyint
DECLARE @last_loc tinyint
-- Premier Bloc
SET @cur_loc = CHARINDEX('.', @AddrIp)
SET @test = LEFT(LEFT(@AddrIp, @cur_loc - 1), 3)
IF PATINDEX('%[^0-9]%', @test) = 0
BEGIN
SET @first = CAST(@test AS smallint)
-- Second Bloc
SET @last_loc = @cur_loc + 1
SET @cur_loc = CHARINDEX('.', @AddrIp, @last_loc)
SET @test = LEFT(SUBSTRING(@AddrIp, @last_loc,
@cur_loc - @last_loc), 3)
IF PATINDEX('%[^0-9]%', @test) = 0
BEGIN
SET @second = CAST(@test AS smallint)
-- Troisième Bloc
SET @last_loc = @cur_loc + 1
SET @cur_loc = CHARINDEX('.', @AddrIp, @last_loc)
SET @test = LEFT(SUBSTRING(@AddrIp, @last_loc,
@cur_loc - @last_loc), 3)
IF PATINDEX('%[^0-9]%', @test) = 0
BEGIN
SET @third = CAST(@test AS smallint)
-- Quatrième Bloc
SET @last_loc = @cur_loc + 1
SET @test = LEFT(SUBSTRING(@AddrIp, @last_loc,
LEN(@AddrIp)
- @last_loc + 1), 3)
IF PATINDEX('%[^0-9]%', @test) = 0
BEGIN
SET @fourth = CAST(@test AS smallint)
END
END
END
END
-- Résultat
IF @first <= 255
AND @second <= 255
AND @third <= 255
AND @fourth <= 255
BEGIN
IF @first <= 127
SET @result = CAST(@first as int) * 0x1000000
+ CAST(@second as int) * 0x10000 + CAST(@third as int)
* 0x100 + CAST(@fourth as int)
ELSE
SET @result = ( CAST(( @first & 0x7F ) as int) * 0x1000000
+ CAST(@second as int) * 0x10000
+ CAST(@third as int) * 0x100
+ CAST(@fourth as int) ) | 0x80000000
END
RETURN @result
END
GO
Conclusion
Ce sont des UDF (User Defined Function), donc au niveau de l'appel ne pas oublier le nom du schéma (ici dbo). Le code est de fait manière qu'en cas d'erreur la fonction renvoie NULL et ne génère pas d'arreur.
Historique
- 06 juin 2007 10:21:52 :
- Ajout de SQL Server dans le titre
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
connexion à une base sql selon adresse ip via wifi [ par rachtout ]
Bonjour à tous,je bloque ça fait trois jours sur ce point.J'ai un pda avec wince 6.0 qui veut se connecter à une base de données sql server se trouvan
Conversion de Sql Server vers Oracle [ par MzSrH ]
Bonjour a tous, J'aimerais savoir s'il vous plait, s'il est possible de créer une application avec un langage tel que VB.NET par exemple qui nous perm
Problème de conversion Access -> SQL Server 2000 [ par NHenry ]
BonjourJ'ai un petit problème, lorsque je tente de convertir (avec l'outils fournis avec SQL Server 2000 Developper edition) une base de données (Acce
adresse sql pour wanadoo [ par CCJ ]
Slt tt le monde bon voila je me suis mis au php et donc au MySQL mais le bleme c'est que je sais pas comment exporter ma base et pour ca il parait qu'
SQL comment écrire cette requête [ par jmey ]
Je cherche une fonction SQL. Voici le problème : J’ai un fichier CLIENT e
Qt et SQL Server [ par spider727 ]
Bonjour,je suis un etudiant et je prepare un projet qui aura un interface avec Qt et une sgbd avec sql management studio 2008 et un serveur sur SQL Se
SQL server 2005 et le réseau [ par crn_c21 ]
Bonjour,Je travaille avec 2 serveurs en réplication de l'un vers l'autre sur un grand réseau.Chaque serveur possède 2 cartes réseau. Pour des raisons
réplication [ par adrahammoud ]
Bonjour, je veux transferer des données d'une base de données vers une autre à l'aide de la réplication en SQL Server 2000. au début je dois disposer
erreur ssis [ par gperuch ]
Bonjour,Je vais faire un petit post avec une auto réponse car j'ai ramé pour trouver la cause de mon pb et que je ne le souhaite à personneLe Problème
limites dans sql server 2005 [ par IhabYktn ]
il n'y a pas de themes convenient.on sait que le nombre de rows dans une table dans sql server 2005 est illimite... j'ai une table qui contiendrait 50
|
Derniers Blogs
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|