USE Sbase
GO
CREATE FUNCTION getNetwork (@ip VARCHAR(MAX), @mask VARCHAR(MAX))
RETURNS VARCHAR(MAX)
BEGIN
--Разделитель между октетами
DECLARE @delimeter CHAR(1) = '.'
--Счетчик
DECLARE @i INT = 1
--Позиции по разделителю
DECLARE @pos INT = CHARINDEX(@delimeter,@ip)
DECLARE @posMask INT = CHARINDEX(@delimeter,@mask) --//Позиции по разделителю
--Переменные для обработки частей ip и маски
DECLARE @id NVARCHAR(MAX)
DECLARE @idMask NVARCHAR(MAX) --//Переменные для обработки частей ip и маски
DECLARE @table TABLE (
ip1 INT
,ip2 INT
,ip3 INT
,ip4 INT
,mask1 INT
,mask2 INT
,mask3 INT
,mask4 INT
,iph VARCHAR(MAX)
,mh VARCHAR(MAX)
)
--Пока есть точки в ip адресе переводим все части в HEX
WHILE(@pos != 0)
BEGIN
SET @id = SUBSTRING(@ip, 1, @pos-1)
SET @idMask = SUBSTRING(@mask, 1, @posMask-1)
IF @i = 1
BEGIN
DECLARE @ip1 INT = @id
DECLARE @m1 INT = @idMask
WHILE LEN(@iph3) < 8
BEGIN
SET @iph3 = '0' + @iph3
END
WHILE LEN(@mh3) < 8
BEGIN
SET @mh3 = @mh3 + '0'
END
END
SET @i = @i + 1
SET @ip = SUBSTRING(@ip, @pos+1, LEN(@ip))
SET @mask = SUBSTRING(@mask, @posMask+1, LEN(@mask))
SET @pos = CHARINDEX(@delimeter,@ip)
SET @posMask = CHARINDEX(@delimeter,@mask)
--Заносим итоговые данные после окончания точек в ip и маске
IF @pos IN (0) AND @posMask IN (0)
BEGIN
WHILE LEN(@iph4) < 8
BEGIN
SET @iph4 = '0' + @iph4
END
WHILE LEN(@mh4) < 8
BEGIN
SET @mh4 = @mh4 + '0'
END
INSERT INTO @table (ip1,ip2,ip3,ip4,
mask1,mask2,mask3,mask4,
iph, mh)
VALUES(@ip1,@ip2,@ip3,@ip4,
@m1,@m2,@m3,@m4,
@iph1+@iph2+@iph3+@iph4,
@mh1+@mh2+@mh3+@mh4
)
END --//Заносим итоговые данные после окончания точек в ip и маске
END
--Количество нулей в маске
DECLARE @maskPathZero INT = (SELECT PATINDEX('%0%',mh) FROM @table)
DECLARE @maskHexNetwork INT = 32 - @maskPathZero + 1
--Преобразование ip в сеть
DECLARE @ipHex VARCHAR(MAX) = (SELECT iph FROM @table)
DECLARE @ipHexNetwork VARCHAR(MAX) = SUBSTRING(@ipHex, 1, 32 - @maskHexNetwork)
WHILE LEN(@ipHexNetwork) < 32
BEGIN
SET @ipHexNetwork = @ipHexNetwork + '0'
END