Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何在SQL SERVER 2005中验证以下格式(基于集合)_Sql Server 2005_Tsql - Fatal编程技术网

Sql server 2005 如何在SQL SERVER 2005中验证以下格式(基于集合)

Sql 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].[

如何限制长度?如12345.789.22.7890无效,因为IP范围为 0-255


请帮助我

为什么不将IP地址与字符串repr一起存储为4 256位元素(字节类型)?当然,它有点浪费空间,但它允许您编写更简单的查询,不是吗

如何限制长度?如12345.789.22.7890无效,因为IP范围为0-255

即使将IP分解为其各自的八位字节,仅基于字符串长度的验证仍然会产生误报,因为任何超过250的整数都有三个字符长

可以在没有子网的IP地址上执行的最有效的验证是使用:

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

假定提交为一个字符串(我将考虑使用CHECK约束来强制执行)。 参考资料:


到目前为止,我在T-SQL中找到的最佳答案是使用概述的规则。我在一个函数中使用了这些规则,该函数在将IP地址转换为大整数之前验证IP地址,以便查找与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

这可以使用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。