Sql server : conversion ip en chaîne de texte vers integer et inverse

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 917 fois - Téléchargée 17 fois

Contenu du snippet

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 / Exemple :


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.

A voir également

Ajouter un commentaire

Commentaires

cs_bahmani00
Messages postés
2
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
6 mars 2010
-
merci pour votre function
mais j'ai change les dernieres resultats; de ligne 87 jusqua 95 avec:

SET @result = CAST(@first as int) * power(CAST(256 as bigint) , 3)+ CAST(@second as int) * power(256 , 2) + CAST(@third as int) * power(256 , 1)+ CAST(@fourth as int)

et ca march bien, on peut enregistrer @result positive. mais changer @result a bigint.
bens78
Messages postés
1
Date d'inscription
jeudi 11 août 2011
Statut
Membre
Dernière intervention
11 août 2011
-
Bonjour skweeky et bahmani00,

je travaille actuellment sur une base de donnée d'adresse ip (à l'aide de phpmyadmin) et jaimerai convertir les adresse IP (en chaine de text) vers integer. Je trouve donc votre fonction très interessante et je pense quelle me sera bien utile!
Cependant je suis encore novice dans ce domaine la et je ne connaissait pas les fonctions UDF jusqu'a présent. Je n'ai donc aucunes idée quant a la manière de les utiliser.
S'ils vous plait, pouvez-vous me dire comment m'y prendre? Dois-je stocker cette fonction dans un fichier? si oui dans quel fichier? et ou dois-je le placer? Quel sont les arguments que je dois modifier dans cette fonction? Quant au 'nom du schema' (dbo), est-ce la même chose que le nom de la base donnée? de la table?
SVP aidez moi je ne sait vraiment pas m'en servir et je ne trouve pas de vrai informations sur ces fonctions a travers le net.
Merci par avance.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.