2009-08-13 2 views
5

Как говорится в вопросе, что эквивалент SQL Server INET_ATON из mySql. Причина, по которой я нуждаюсь в этом, заключается в том, что я импортировал базу данных IP от http://ipinfodb.com/ip_database.php в SQL Server 2005 и хотел бы запросить таблицу сейчас. Но на основании их примеров я не уверен, как это сделать.Что такое эквивалент SQL Server INET_ATON

INET_ATON(expr)

Учитывая четырехчисловая представление сетевого адреса в виде строки, возвращает целое число, представляющее числовое значение адреса. Адреса могут быть 4- или 8-байтными адресами.

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

Посмотреть аналогичный вопрос: http://stackoverflow.com/questions/695568/porting-from- mysql-to-t-sql-any-inet-aton-эквивалент –

ответ

5

Взгляни на этих stored procedure examples для достижения этого Примера

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 

использования

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

Если вы хотите отменить, что и превратить целое число в четырехчисловой, попробуйте этот

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

Что я могу использовать для преобразования этого числа обратно в ip? – Geo

+0

он включен в связанную статью –

+0

Ах, только что увидел ссылку ... Спасибо! – Geo

0

Там нет ни встроенную функцию, чтобы сделать это в MSSQL, однако формула для преобразования ABCD к IP-номер не:

Номер IP = А х (256 * 256 * 256) + B x (256 * 256) + C x 256 + D

У меня могут быть функции sql, написанные где-то, чтобы сделать это, плохо взгляните.

3

Я пришел сюда, ища то же самое, и применил решение Пола Диксона.

Однако я заметил, что у нас есть несколько IPv6-адреса, поэтому я изменил его немного:

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 
Смежные вопросы