Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SQL SERVER : CONVERSION IP EN CHAÎNE DE TEXTE VERS INTEGER ET INVERSE


Information sur la source

Catégorie :Fonctions Classé sous : tsql, sql, ip, adresse, conversion Niveau : Initié Date de création : 06/06/2007 Date de mise à jour : 06/06/2007 10:21:52 Vu : 3 846

Note :
Aucune note

Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note


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

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

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. &nbsp; Voici le probl&#232;me&nbsp;: &nbsp; J&#146;ai un fichier CLIENT e 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 Problème pour installer SQL Server Express 2005 [ par OneHacker ] Alors je reposte pour la 3eme fois ce sujet car je n'ai toujours pas eu de réponses.Je suis aller sur ce lien pour télécharger SQL Server Problème de copnversion Access -> SQL Server 2000 champs Date [ par NHenry ] BonjourJ'ai un problème : Lorsque j'utilise l'assistant d'importation/exportation de données entre Access et SQL Server 2000, il me convertit les cha Padr en SQL server 2005 [ par belleisa_net ] Bonjour à vous tous,J'aimerais avoir votre expertise pour pouvoir régler mon problème. J'ai un champ (nvarchar) dans un table et lors du select je vou Problème procedure sql [ par toomsbzh ] Bonjour,J'ai un problème lorsque je veux mettre ma procédure sous oracle il me dis que j'ai une erreur de compilation mais je ne vois pas où, si vous Connexion a un remote Serveur SQL Express [ par usbeck ] Bonjour,C'est un sujet très récurant et pourtant je n'arrive pas à résoudre mon probleme. Je n'arrive pas à me connecter depuis un autre ordi sur ma B Activation des connexions distantes sous MSSQL Express [ par dragon ] Pour que les connexions distantes fonctionnent sous Microsoft SQL 2005 express, il faut que TCP/IP soit activé. Aucun problème, sauf que je suis en tr Requetes SQL !! [ par lolo80000 ] bonjour à tous,à partir du numero de processus dans la table processus je voudrai recuperer tout les champs de la table objectif, mais je n'y arrive v


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Appels d'offres



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.