Обновление IP-адресов MSSQL до бинарных (32) - PullRequest
0 голосов
/ 04 сентября 2018

У меня проблема с преобразованием моих IP-адресов (в таблице как varchar) в двоичный (32) формат

У меня есть стол

NETWORKS
Network_IP    Network_IP_in_binary   subnet_of_IP   subnet_of_IP_in_binary
24.55.186.203     NULL                    23           NULL
24.55.185.203     NULL                    45           NULL
24.55.184.203     NULL                    74           NULL
24.55.181.203     NULL                    45           NULL
24.55.183.203     NULL                    78           NULL
...                ...                    ...           ...

выбор / функция / обновление

--DECLARE @ipd as varchar(200)
--SET @ipd = (SELECT [Network_IP] FROM [Database].[dbo].[Networks] WHERE [Network_IP] = @IPd)

declare @ip varchar(200)
declare @address varchar(200)
set @address = 
--@ipd  
'24.55.186.203'
set @ip = parsename(@address,1)
DECLARE @Binary   VARCHAR(200)
SET @Binary = ''

   WHILE @IP <> 0
   BEGIN
      SET @Binary = SUBSTRING('0123456789', (@IP % 2) + 1, 1) + @Binary
      SET @IP = @IP / 2
   END

SET @IP = parsename(@address,2)

   WHILE @IP <> 0
   BEGIN
      SET @Binary = SUBSTRING('0123456789', (@IP % 2) + 1, 1) + @Binary
      SET @IP = @IP / 2
   END

SET @IP = parsename(@address,3)

   WHILE @IP <> 0
   BEGIN
      SET @Binary = SUBSTRING('0123456789', (@IP % 2) + 1, 1) + @Binary
      SET @IP = @IP / 2
   END

SET @IP = parsename(@address,4)
   WHILE @IP <> 0
   BEGIN
      SET @Binary = SUBSTRING('0123456789', (@IP % 2) + 1, 1) + @Binary
      SET @IP = @IP / 2
   END

SELECT right('000000000000000000000000000000' + cast(@Binary as varchar),30)

Мне нужен такой стол, но

  1. Я не могу настроить объявление выбора или обновления для более чем одного адреса

  2. тогда я не могу понять Обновление таблицы сети

  3. тогда я не могу поместить адрес подсети of_of_IP в двоичный формат

  4. Последнее, что мне не удалось, это обновление сети таблиц и установка двоичного формата в правый столбец.

NETWORKS
Network_IP           Network_IP_in_binary           subnet_of_IP         subnet_of_IP_in_binary
24.55.186.203     000110001101111011101111001011        23           000110001101111011101111001011
24.55.185.203     000110001101111011101111001011        45           000110001101111011101111001011
24.55.184.203     000110001101111011101111001011        74           000110001101111011101111001011
24.55.181.203     000110001101111011101111001011        45           000110001101111011101111001011
24.55.183.203     000110001101111011101111001011        78           000110001101111011101111001011
     ...                    ...                        ...                      ...

Читаю статьи на сайтах:

Но я не могу выяснить обновления от них.

1 Ответ

0 голосов
/ 04 сентября 2018

Хотя я согласен с комментарием Панагиотиса и с принятым ответом в вопросе, с которым вы связались (то есть, сохраняйте IP как двоичный (4), а не как текст), вы не можете быть в состоянии принять решение эти вещи (я вижу много вопросов о том, как работать с базами данных, которые нельзя изменить, даже если альтернативный дизайн решит все проблемы) - Таким образом, чтобы преобразовать адрес IPv4 в строковое представление двоичного значения, вы можете использовать последовательность битовых операций для создания этой строки для каждой из 4 частей IP-адреса:

CREATE FUNCTION TinyIntToBinaryString(@value tinyint)
RETURNS CHAR(8)
AS
BEGIN

    RETURN CAST(SIGN(@value & 128) as char(1)) +
           CAST(SIGN(@value & 64) as char(1)) +
           CAST(SIGN(@value & 32) as char(1)) + 
           CAST(SIGN(@value & 16) as char(1)) +
           CAST(SIGN(@value & 8) as char(1)) +
           CAST(SIGN(@value & 4) as char(1)) +
           CAST(SIGN(@value & 2) as char(1)) +
           CAST(SIGN(@value & 1)  as char(1)) 
END

Это вернет строковое представление двоичного значения любого числа от 0 до 255 - поэтому 3 вернет 00000011, а 174 вернет 10101110.

Теперь, когда у вас есть это, вы можете использовать его для преобразования всего IP-адреса в двоичное строковое представление:

DECLARE @IP varchar(15) = '24.55.186.203'

SELECT dbo.TinyIntToBinaryString(PARSENAME(@IP, 4)) +
       dbo.TinyIntToBinaryString(PARSENAME(@IP, 3)) +
       dbo.TinyIntToBinaryString(PARSENAME(@IP, 2)) +
       dbo.TinyIntToBinaryString(PARSENAME(@IP, 1))

Результатом будет 00011000001101111011101011001011

Конечно, вы можете создать функцию, которая будет преобразовывать полное представление строки IP для вас - я оставлю это на ваше усмотрение, чтобы написать.

...