2010-01-11 33 views

回答

-1

如何限制長度?像12345.789.22.7890是無效的,因爲IP 0-255

範圍即使你分手的IP到各自的八位組,驗證對字符串的長度完全基於仍然會產生誤報的原因,超過250的整數爲三個字符長。

可以在IP地址沒有子網進行最驗證是使用:

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

...假設提交一個字符串(我會考慮使用CHECK約束實施)。

參考文獻:

+0

LIKE [1-250]不起作用。 SELECT IIF('24'LIKE'[1-250]',1,0)返回0而不是1。 – 2014-03-21 08:21:45

0

爲什麼IP地址不是存儲爲4 256位元素(字節型)用字符串再版一起?當然,它有點浪費空間,但它可以讓你編寫更簡單的查詢,不是嗎?

0

最佳答案我已經在T-SQL至今使用概述in a blog article的規則中。我將這些規則用於驗證IP地址的函數,然後將其轉換爲大整數,以便查找與IP地址關聯的國家/地區。這很有幫助,因爲我無法控制IP地址的輸入值,所以我無法在源系統上強制執行數據完整性約束。下面是已修改的功能的副本,以便在IP地址有效時返回1,如果無效則返回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

這可以使用SQL Server的PARSENAME函數來實現。 下面是對此的完整演示: 我們首先創建一個表並使用PARSENAME定義CHECK約束。

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/