Chinaunix首页 | 论坛 | 博客
  • 博客访问: 445999
  • 博文数量: 750
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4970
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 12:36
文章分类

全部博文(750)

文章存档

2011年(1)

2008年(749)

我的朋友
最近访客

分类:

2008-09-09 15:25:14


  对于SQL Server 2000,你可以使用下列函数:
  
  CREATE FUNCTION dbo.IPAddrStr2Bin(@strIP varchar(15), @Validate bit = 1)
  RETURNS binary(4)
  AS
  BEGIN
  IF @Validate = 1
  BEGIN
  -- only digits and dots
  IF @strIP LIKE '%[^.0-9]%' RETURN (NULL)
  -- number of dots must be 3
  IF LEN(@strIP) - LEN(REPLACE(@strIP, '.', '')) != 3 RETURN (NULL)
  -- all octets must be specified
  IF @strIP NOT LIKE '%_%.%_%.%_%.%_%' RETURN (NULL)
  END
  DECLARE @oct1 binary(1),
  @oct2 binary(1),
  @oct3 binary(1),
  @oct4 binary(1)
  SET @oct1 = CAST(CAST(LEFT(@strIP, CHARINDEX('.', @strIP) - 1) AS int) AS
  binary(1))
  SET @oct2 = CAST(CAST(SUBSTRING(@strIP, CHARINDEX('.', @strIP) + 1,
  CHARINDEX('.', @strIP, CHARINDEX('.', @strIP) + 1) - CHARINDEX('.', @strIP)
  - 1) AS int) AS binary(1))
  SET @oct3 = CAST(CAST(SUBSTRING(@strIP, CHARINDEX('.', @strIP,
  CHARINDEX('.', @strIP) + 1) + 1, (LEN(@strIP) - CHARINDEX('.',
  REVERSE(@strIP)) + 1) - (CHARINDEX('.', @strIP, CHARINDEX('.', @strIP) + 1))
  - 1) AS int) AS binary(1))
  SET @oct4 = CAST(CAST(RIGHT(@strIP, LEN(@strIP) - (LEN(@strIP) -
  CHARINDEX('.', REVERSE(@strIP)) + 1)) AS int) AS binary(1))
  IF @Validate = 1
  BEGIN
  IF NOT(
  (@oct1 BETWEEN 0x01 AND 0xFF) AND
  (@oct2 BETWEEN 0x00 AND 0xFF) AND
  (@oct3 BETWEEN 0x00 AND 0xFF) AND
  (@oct4 BETWEEN 0x00 AND 0xFF)
  ) RETURN(NULL)
  END
  RETURN (@oct1 + @oct2 + @oct3 + @oct4)
  END
  GO
  
  使用例子:
  SELECT dbo.IPAddrStr2Bin('172.29.23.2', 0)
  
  对于 SQL Server较早的版本,你可以抽出代码,然后直接使用,或者创建如下所示的过程:
  
  CREATE PROCEDURE dbo.spIPAddrStr2Bin
  @strIP varchar(15),
  @binIP binary(4) OUTPUT,
  @Validate bit = 1
  AS
  IF @Validate = 1
  BEGIN
  -- only digits and dots
  IF @strIP LIKE '%[^.0-9]%' RETURN (NULL)
  -- number of dots must be 3
  IF LEN(@strIP) - LEN(REPLACE(@strIP, '.', '')) != 3 RETURN (NULL)
  -- all octets must be specified
  IF @strIP NOT LIKE '%_%.%_%.%_%.%_%' RETURN (NULL)
  END
  DECLARE @oct1 binary(1),
  @oct2 binary(1),
  @oct3 binary(1),
  @oct4 binary(1)
  SET @oct1 = CAST(CAST(LEFT(@strIP, CHARINDEX('.', @strIP) - 1) AS int) AS
  binary(1))
  SET @oct2 = CAST(CAST(SUBSTRING(@strIP, CHARINDEX('.', @strIP) + 1,
  CHARINDEX('.', @strIP, CHARINDEX('.', @strIP) + 1) - CHARINDEX('.',
  @strIP) - 1) AS int) AS binary(1))
  SET @oct3 = CAST(CAST(SUBSTRING(@strIP, CHARINDEX('.', @strIP,
  CHARINDEX('.', @strIP) + 1) + 1, (LEN(@strIP) - CHARINDEX('.',
  REVERSE(@strIP)) + 1) - (CHARINDEX('.', @strIP, CHARINDEX('.', @strIP) +
  1)) - 1) AS int) AS binary(1))
  SET @oct4 = CAST(CAST(RIGHT(@strIP, LEN(@strIP) - (LEN(@strIP) -
  CHARINDEX('.', REVERSE(@strIP)) + 1)) AS int) AS binary(1))
  IF @Validate = 1
  BEGIN
  IF NOT(
  (@oct1 BETWEEN 0x01 AND 0xFF) AND
  (@oct2 BETWEEN 0x00 AND 0xFF) AND
  (@oct3 BETWEEN 0x00 AND 0xFF) AND
  (@oct4 BETWEEN 0x00 AND 0xFF)
  ) RETURN(NULL)
  END
  SET @binIP = @oct1 + @oct2 + @oct3 + @oct4
  GO
  
  使用例子:
  
  DECLARE @binIP binary(4)
  EXEC dbo.spIPAddrStr2Bin '172.29.23.2', @binIP OUTPUT, 0
  PRINT @binIP
  
  注意: 如果你不需要或不想验证自己的字符串IP地址,可以完全删掉对它们进行处理的代码。
【责编:admin】

--------------------next---------------------

阅读(414) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~