2009-08-13 33 views
5

Como la pregunta dice cuál es el equivalente de SQL Server de INET_ATON de mySql. La razón por la que necesito esto es porque importé una base de datos de IP de http://ipinfodb.com/ip_database.php a SQL Server 2005 y ahora quisiera consultar la tabla. Pero basado en sus ejemplos, no estoy seguro de cómo hacer eso.¿Cuál es el equivalente de SQL Server de INET_ATON

INET_ATON(expr)

Dada la representación decimal con puntos de una dirección de red como una cadena , devuelve un entero que representa el valor numérico de la dirección. Las direcciones pueden ser direcciones de 4 u 8 bytes .

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

Ver pregunta similar: http://stackoverflow.com/questions/695568/porting-from- mysql-to-t-sql-any-inet-aton-equivalent –

Respuesta

5

Echa un vistazo a estos stored procedure examples para lograr este

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 

Ejemplo de uso

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

Si desea revertir eso y convertir un entero en un decimal con puntos, probar este

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

¿Qué puedo usar para convertir ese número a una IP? – Geo

+0

está cubierto en el artículo vinculado –

+0

Ah, acabo de ver el enlace ... ¡Gracias! – Geo

0

Hay no se construye en función de hacer esto en MSSQL, sin embargo, la fórmula para la conversión de ABCD a un número IP es:

Número IP = A x (256 * 256 * 256) + B x (256 * 256) + C x 256 + D

Es posible que tenga las funciones sql escritas en algún lugar para hacer esto, eche un vistazo.

3

Vine aquí buscando lo mismo y apliqué la solución de Paul Dixon.

Sin embargo, he notado que también tenemos algunas direcciones IPv6, así que lo cambié un poco:

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 
Cuestiones relacionadas