Как проверить приведенный ниже формат в SQL SERVER 2005 (SET BASED) - PullRequest
1 голос
/ 11 января 2010

Как ограничить длину? Например, 12345.789.22.7890 недопустимо, поскольку IP-адрес варьируется от 0-255

Пожалуйста, помогите мне

Ответы [ 4 ]

0 голосов
/ 18 августа 2015

Этого можно добиться с помощью функции PARSENAME в SQL Server. Ниже приводится полная демонстрация для этого: Давайте сначала создадим одну таблицу и определим ограничение CHECK, используя PARSENAME.

CREATE TABLE tbl_IPAddress
(
 IPAddress VARCHAR(15)
)
GO

ALTER TABLE tbl_IPAddress ADD CONSTRAINT chk_tbl_IPAddress_IPAddress
CHECK 
(
 (ParseName(IPAddress, 4) = 12) 
 AND (ParseName(IPAddress, 3) = 4) 
 AND (ParseName(IPAddress, 2) BETWEEN 8 AND 26) 
 AND (ParseName(IPAddress, 1) BETWEEN 1 AND 255) 
)
GO

Вы можете увидеть разные четыре части проверки,

Первые две части проверки: только диапазон IP-адресов начинается с 12,4 Последние две части проверки: с 8 по 26. От 1 до 255.

Значит, действительный IP-адрес:

12.4.8.125

12.4.15.241

Неверный IP-адрес:

10.2.21.52

12.4.7.124

Для получения более подробной информации, пожалуйста, посетите: http://www.dbrnd.com/2015/06/validate-ip-address-range-in-sql-server/

0 голосов
/ 11 января 2010

Как ограничить длину? Например, 12345.789.22.7890 является недопустимым, поскольку IP-адрес колеблется от 0 до 255

.

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

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

LIKE [1-250].[0-250].[0-250].[0-250]

... при условии представления в виде одной строки (которую я бы рассмотрел с помощью ограничения CHECK для обеспечения выполнения).

Ссылки:

0 голосов
/ 21 марта 2014

Лучший ответ, который я нашел в T-SQL на данный момент, - это использование правил, изложенных в статье блога . Я использовал эти правила в функции, которая проверяет IP-адреса перед преобразованием их в большие целые числа, чтобы можно было искать страну, связанную с IP-адресом. Это было полезно, так как у меня не было контроля над входными значениями для IP-адреса, поэтому я не мог применять ограничения целостности данных в исходной системе. Ниже приведена копия функции, измененной так, что она возвращает 1, если IP-адрес действителен, и 0, если он недействителен.

CREATE FUNCTION dbo.udf_ValidateIPAddress
    (@InputString VARCHAR(8000))
RETURNS TINYINT
AS
BEGIN

    DECLARE @Return BIGINT = IIF(@InputString LIKE '%_.%_.%_.%_'  -- 3 periods and no empty octets 
        AND @InputString NOT LIKE '%.%.%.%.%'  -- not 4 periods or more 
        AND @InputString NOT LIKE '%[^0-9.]%'  -- no characters other than digits and periods 
        AND @InputString NOT LIKE '%[0-9][0-9][0-9][0-9]%'  -- not more than 3 digits per octet 
        AND @InputString NOT LIKE '%[3-9][0-9][0-9]%'  -- NOT 300 - 999 
        AND @InputString NOT LIKE '%2[6-9][0-9]%'  -- NOT 260 - 299 
        AND @InputString NOT LIKE '%25[6-9]%'  -- NOT 256 - 259 
        , 1, 0)

    RETURN @Return;

END
0 голосов
/ 11 января 2010

Почему бы не сохранить IP-адрес в виде 4-х 256-битных элементов (байт) вместе со строкой repr? Конечно, это пустая трата места, но позволяет писать более простые запросы, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...