Sql server 2005 如何在SQL SERVER 2005中验证以下格式(基于集合)
如何限制长度?如12345.789.22.7890无效,因为IP范围为 0-255Sql server 2005 如何在SQL SERVER 2005中验证以下格式(基于集合),sql-server-2005,tsql,Sql Server 2005,Tsql,如何限制长度?如12345.789.22.7890无效,因为IP范围为 0-255 请帮助我为什么不将IP地址与字符串repr一起存储为4 256位元素(字节类型)?当然,它有点浪费空间,但它允许您编写更简单的查询,不是吗 如何限制长度?如12345.789.22.7890无效,因为IP范围为0-255 即使将IP分解为其各自的八位字节,仅基于字符串长度的验证仍然会产生误报,因为任何超过250的整数都有三个字符长 可以在没有子网的IP地址上执行的最有效的验证是使用: LIKE [1-250].[
请帮助我为什么不将IP地址与字符串repr一起存储为4 256位元素(字节类型)?当然,它有点浪费空间,但它允许您编写更简单的查询,不是吗 如何限制长度?如12345.789.22.7890无效,因为IP范围为0-255 即使将IP分解为其各自的八位字节,仅基于字符串长度的验证仍然会产生误报,因为任何超过250的整数都有三个字符长 可以在没有子网的IP地址上执行的最有效的验证是使用:
LIKE [1-250].[0-250].[0-250].[0-250]
假定提交为一个字符串(我将考虑使用CHECK约束来强制执行)。 参考资料:
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
这可以使用SQLServer的PARSENAME函数实现。 下面是此功能的完整演示: 让我们首先创建一个表,并使用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
有关更多详情,请访问:
LIKE[1-250]不起作用。选择IIF('24'像'[1-250]',1,0)返回0而不是1。