2009-08-13 6 views
5

Comme la question indique quel est l'équivalent SQL Server de INET_ATON de mySql. La raison pour laquelle j'ai besoin de cela est parce que j'ai importé une base de données IP de http://ipinfodb.com/ip_database.php dans SQL Server 2005 et voudrais interroger la table maintenant. Mais sur la base de leurs exemples, je ne suis pas sûr de savoir comment faire cela.Quel est l'équivalent SQL Server de INET_ATON

INET_ATON(expr)

Compte tenu de la représentation en pointillé quad- d'une adresse de réseau en tant que chaîne, renvoie un nombre entier qui représente la valeur numérique de l'adresse. Les adresses peuvent être des adresses de 4 ou 8 octets.

mysql> SELECT INET_ATON('209.207.224.40'); 
     -> 3520061480 
+1

Voir question similaire: http://stackoverflow.com/questions/695568/porting-from- mysql-to-t-sql-any-inet-aton-équivalent –

Répondre

5

Jetez un oeil à ces stored procedure examples pour atteindre cet

CREATE FUNCTION dbo.ipStringToInt 
( 
    @ip CHAR(15) 
) 
RETURNS INT 
AS 
BEGIN 
    DECLARE @rv INT, 
     @o1 INT, 
     @o2 INT, 
     @o3 INT, 
     @o4 INT, 
     @base INT 

    SELECT 
     @o1 = CONVERT(INT, PARSENAME(@ip, 4)), 
     @o2 = CONVERT(INT, PARSENAME(@ip, 3)), 
     @o3 = CONVERT(INT, PARSENAME(@ip, 2)), 
     @o4 = CONVERT(INT, PARSENAME(@ip, 1)) 

    IF (@o1 BETWEEN 0 AND 255) 
     AND (@o2 BETWEEN 0 AND 255) 
     AND (@o3 BETWEEN 0 AND 255) 
     AND (@o4 BETWEEN 0 AND 255) 
    BEGIN  
     SELECT @base = CASE 
      WHEN @o1 < 128 THEN 
       (@o1 * 16777216) 
      ELSE 
       -(256 - @o1) * 16777216 
      END 

     SET @rv = @base + 
      (@o2 * 65536) + 
      (@o3 * 256) + 
      (@o4) 
    END 
    ELSE 
     SET @rv = -1 
    RETURN @rv 
END 

Exemple d'utilisation

INSERT mytable VALUES(dbo.ipStringToInt('1.2.3.4')) 

Si vous voulez inverser cette tendance et transformer un entier en pointillés-quad, essayez cette

CREATE FUNCTION dbo.ipIntToString 
( 
    @ip bigINT 
) 
RETURNS CHAR(15) 
AS 
BEGIN 
    DECLARE @o1 bigINT, 
     @o2 bigINT, 
     @o3 bigINT, 
     @o4 bigINT 

    IF ABS(@ip) > 4294967295 
     RETURN '255.255.255.255' 

    SET @o1 = @ip/16777216 

    IF @o1 = 0 
     SELECT @o1 = 255, @ip = @ip + 16777216 

    ELSE IF @o1 < 0 
    BEGIN 
     IF @ip % 16777216 = 0 
      SET @o1 = @o1 + 256 
     ELSE 
     BEGIN 
      SET @o1 = @o1 + 255 
      IF @o1 = 128 
       SET @ip = @ip + 2147483648 
      ELSE 
       SET @ip = @ip + (16777216 * (256 - @o1)) 
     END 
    END 
    ELSE 
    BEGIN 
     SET @ip = @ip - (16777216 * @o1) 
    END 

    SET @ip = @ip % 16777216 
    SET @o2 = @ip/65536 
    SET @ip = @ip % 65536 
    SET @o3 = @ip/256 
    SET @ip = @ip % 256 
    SET @o4 = @ip 

    RETURN 
     CONVERT(VARCHAR(4), @o1) + '.' + 
     CONVERT(VARCHAR(4), @o2) + '.' + 
     CONVERT(VARCHAR(4), @o3) + '.' + 
     CONVERT(VARCHAR(4), @o4) 
END 
+0

que puis-je utiliser pour convertir ce nombre en ip? – Geo

+0

il est couvert dans l'article lié –

+0

Ah, juste vu le lien ... Merci! – Geo

0

Il n'y a pas construit en fonction de le faire dans MSSQL, mais la formule de conversion ABCD à un numéro IP est:

IP Number = A x (256 * 256 * 256) + B x (256 * 256) + C x 256 + D

Je peux avoir les fonctions sql écrites quelque part pour ce faire, mal jeter un oeil.

3

Je suis venu ici à la recherche de la même, et j'ai appliqué la solution de Paul Dixon.

Cependant, je remarque que nous avons aussi quelques adresses IPv6, donc je l'ai changé un peu:

CREATE FUNCTION [dbo].[ip2int] 
(
    @ip VARCHAR(15) 
) 
RETURNS INT 
AS 
BEGIN 
DECLARE @rv INT, 
     @o1 INT, 
     @o2 INT, 
     @o3 INT, 
     @o4 INT, 
     @base INT 

IF ISNUMERIC(PARSENAME(@ip, 4) + '.0e0') =0 OR ISNUMERIC(PARSENAME(@ip, 3) + '.0e0') =0 OR ISNUMERIC(PARSENAME(@ip, 2) + '.0e0') =0 OR ISNUMERIC(PARSENAME(@ip, 1) + '.0e0') =0 
    BEGIN 
     set @rv = -2 
    END 
ELSE 
    BEGIN 
    SELECT 
     @o1 = CONVERT(INT, PARSENAME(@ip, 4)), 
     @o2 = CONVERT(INT, PARSENAME(@ip, 3)), 
     @o3 = CONVERT(INT, PARSENAME(@ip, 2)), 
     @o4 = CONVERT(INT, PARSENAME(@ip, 1)) 

    IF (@o1 BETWEEN 0 AND 255) 
     AND (@o2 BETWEEN 0 AND 255) 
     AND (@o3 BETWEEN 0 AND 255) 
     AND (@o4 BETWEEN 0 AND 255) 
    BEGIN  
     SELECT @base = CASE 
      WHEN @o1 < 128 THEN 
       (@o1 * 16777216) 
      ELSE 
       -(256 - @o1) * 16777216 
      END 

     SET @rv = @base + 
      (@o2 * 65536) + 
      (@o3 * 256) + 
      (@o4) 
    END 
    ELSE 
     SET @rv = -1 
    END 
    RETURN @rv 

END 
Questions connexes