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 : 5 457

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

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. &nbsp; Voici le probl&#232;me&nbsp;: &nbsp; J&#146;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


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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,452 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é.