begin process at 2010 02 09 23:29:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fonctions

 > 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

Note :
Aucune note
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 :6 342

Auteur : skweeky

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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

 Sources du même auteur

SQL SERVER : VÉRIFICATION DE L'ESPACE LIBRE SUR LE SERVEUR
SQL SERVER 2005 : HISTORISER LES PROCÉDURES STOCKÉES D'UNE B...
SQL SERVER 2005 : RECHERCHE DE CHAMPS PAR LEURS NOMS MULTI B...
SQL SERVER 2005 : RÉCUPÉRER LE CONTENU D'UN SCHÉMA XSD
SQL SERVER – AGRÉGER DES CHAMPS VARCHAR

 Sources de la même categorie

Source avec Zip CALCUL UNE DIFFÉRENCE DE DATE EN FONCTION DE JOURS FÉRIÉS/TR... par Sieurcoug
Source avec Zip CONVERSION DE NOMBRE EN LETTRES (SQL) par wormlore
NO HTML BALISE [MYSQL] par abdoulax
MYSQL : FONCTION POUR GÉRER DES COMPTEURS ÉQUIVALENT AUX SÉQ... par maitredede
RÉINDEXER TOUTES LES TABLES D'UNE BASE DE DONNÉES par pneau

 Sources en rapport avec celle ci

Source avec Zip CONVERSION DE NOMBRE EN LETTRES (SQL) par wormlore
TROUVER LES PROCHAINS ANNIVERSAIRES par zefo
REQUÊTE SQL POUR DÉTERMINER L'ESPACE OCCUPÉ DANS LES TABLESP... par sgoriaud
Source avec Zip LISTE DES PAYS DU MONDE EN FRANÇAIS/ANGLAIS DANS UNE BASE SQ... par Joe_le_mort
REQUETE SUPPRESSION DE DOUBLON par tba

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...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales