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
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
comment exécuter un script sql à partir de la ligne de commande ? [ par feros2184 ]
salut Je suis sur le point d'utiliser l'utilitaire tablediff.exe de SQL Server
[SQL Express] Crypter les données d'une BD ou la BD entière [ par vbman31 ]
Bonjour,Je développe une application qui utilise une BD SQL Express.Est-il possible de crypter entièrement la BD pour ne pas que le client puisse lire
|
Derniers Blogs
[WP7] AJOUTER DES IMAGES DANS LA MEDIA LIBRARY D'UN WINDOWS PHONE 7[WP7] AJOUTER DES IMAGES DANS LA MEDIA LIBRARY D'UN WINDOWS PHONE 7 par Audrey
L'émulateur Windows Phone 7, fourni avec la version Beta des outils développeurs n'inclut aucune image dans sa bibliothèque. Pas très pratique de tester son application lorsque l'on souhaite que l'utilisateur puisse choisir une image présente dans le télé...
Cliquez pour lire la suite de l'article par Audrey VIVE LES MOCKS ET LES POCOSVIVE LES MOCKS ET LES POCOS par vLabz
J'observe régulièrement autour de moi de la confusion à propos de ces deux termes et j'aimerais juste rappeler ce qu'ils signifient. Je ne suis bien sûr pas le mieux placé pour faire une leçon mais je vais faire de mon mieux pour mettre en valeur ce q...
Cliquez pour lire la suite de l'article par vLabz [WF4] WORKFLOW AND CUSTOM ACTIVITIES - BEST PRACTICES (4/5)[WF4] WORKFLOW AND CUSTOM ACTIVITIES - BEST PRACTICES (4/5) par JeremyJeanson
Vendredi dernier Microsoft a publié le quatrième épisode des bonnes pratiques pour coder ses activités custom dans WF4 : endpoint.tv - Workflow and Custom Activities - Best Practices (Part 4) . Tout comme pour les précédents épisodes, j'ai pris le temps d...
Cliquez pour lire la suite de l'article par JeremyJeanson DéVELOPPEMENT MOBILE : .NET COMPACT FRAMEWORK & LIMITATIONSDéVELOPPEMENT MOBILE : .NET COMPACT FRAMEWORK & LIMITATIONS par Pi-R
Introduction :
Le développement d'applications mobiles est quelque peu différent du développement d'applications sous Windows. En effet, le développement d'applications mobiles se base sur le .NET Compact Fra...
Cliquez pour lire la suite de l'article par Pi-R IPHONE VERSUS WP7 CODINGIPHONE VERSUS WP7 CODING par Nicolas
Je relais une présentation sur slideshare.net, qui compare le développement sur Iphone et Windows Phone 7, qui ma fait sourire. I phone versus windows phone 7 coding View more presentations from www.donburnett.com. J'aurais bien aimé une comparai...
Cliquez pour lire la suite de l'article par Nicolas
Logiciels
Xilisoft HD Vidéo Convertisseur 6 (6.0.3.0421)XILISOFT HD VIDéO CONVERTISSEUR 6 (6.0.3.0421)Xilisoft HD Vidéo Convertisseur est un outil professionnel de conversion HDTV, conçu pour transfo... Cliquez pour télécharger Xilisoft HD Vidéo Convertisseur 6 Xilisoft MP4 Convertisseur 6 (6.0.2.0415)XILISOFT MP4 CONVERTISSEUR 6 (6.0.2.0415)Xilisoft MP4 Convertisseur est un outil puissant pour la conversion de vidéo MP4, qui peut conver... Cliquez pour télécharger Xilisoft MP4 Convertisseur 6 Vade Retro Desktop (3.03)VADE RETRO DESKTOP (3.03)Le logiciel antispam Vade Retro pour Microsoft Outlook®, Outlook Express® et Windows Mail®(Vista)... Cliquez pour télécharger Vade Retro Desktop Malwarebytes Anti Malwares (1.46)MALWAREBYTES ANTI MALWARES (1.46)Malwarebytes' Anti-Malware est un anti-malware qui peut éliminer même les plus avancés des logic... Cliquez pour télécharger Malwarebytes Anti Malwares
|