使用TSQL计算网络掩码中的主机数

使用TSQL计算网络掩码中的主机数,sql,tsql,ip-address,netmask,Sql,Tsql,Ip Address,Netmask,如何在不使用表的情况下使用TSQL计算网络掩码中的主机数 例如: IP Number of Host 255.255.255.252 = 4 255.255.254.0 = 512 下面是示例查询: select (256-T.I1)*(256-T.I2)*(256-T.I3)*(256-T.I4) from ( select dbo.fnParseString(-1, '.', IP) 'I1',

如何在不使用表的情况下使用TSQL计算网络掩码中的主机数

例如:

IP                   Number of Host
255.255.255.252  =   4 
255.255.254.0    =   512

下面是示例查询:

select (256-T.I1)*(256-T.I2)*(256-T.I3)*(256-T.I4)
  from (
    select 
      dbo.fnParseString(-1, '.', IP) 'I1',
      dbo.fnParseString(-2, '.', IP) 'I2',
      dbo.fnParseString(-3, '.', IP) 'I3',
      dbo.fnParseString(-4, '.', IP) 'I4'
      from (select '255.255.255.252' as IP
            union
            select '255.255.254.0') T1
       )
as T
CREATE FUNCTION dbo.fnParseString
(
    @Section SMALLINT,
    @Delimiter CHAR,
    @Text varchar(100)
)
RETURNS VARCHAR(8000)
AS

BEGIN
DECLARE @NextPos SMALLINT,
        @LastPos SMALLINT,
        @Found SMALLINT

IF @Section > 0
SELECT  @Text = REVERSE(@Text)
SELECT  @NextPos = CHARINDEX(@Delimiter, @Text, 1),
@LastPos = 0,
@Found = 1

WHILE @NextPos > 0 AND ABS(@Section) <> @Found
SELECT  @LastPos = @NextPos,
    @NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1),
    @Found = @Found + 1
    RETURN  CASE
    WHEN @Found <> ABS(@Section) OR @Section = 0 THEN NULL

WHEN @Section > 0 THEN REVERSE(SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END))

ELSE SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)
END

END
下面是函数:

select (256-T.I1)*(256-T.I2)*(256-T.I3)*(256-T.I4)
  from (
    select 
      dbo.fnParseString(-1, '.', IP) 'I1',
      dbo.fnParseString(-2, '.', IP) 'I2',
      dbo.fnParseString(-3, '.', IP) 'I3',
      dbo.fnParseString(-4, '.', IP) 'I4'
      from (select '255.255.255.252' as IP
            union
            select '255.255.254.0') T1
       )
as T
CREATE FUNCTION dbo.fnParseString
(
    @Section SMALLINT,
    @Delimiter CHAR,
    @Text varchar(100)
)
RETURNS VARCHAR(8000)
AS

BEGIN
DECLARE @NextPos SMALLINT,
        @LastPos SMALLINT,
        @Found SMALLINT

IF @Section > 0
SELECT  @Text = REVERSE(@Text)
SELECT  @NextPos = CHARINDEX(@Delimiter, @Text, 1),
@LastPos = 0,
@Found = 1

WHILE @NextPos > 0 AND ABS(@Section) <> @Found
SELECT  @LastPos = @NextPos,
    @NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1),
    @Found = @Found + 1
    RETURN  CASE
    WHEN @Found <> ABS(@Section) OR @Section = 0 THEN NULL

WHEN @Section > 0 THEN REVERSE(SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END))

ELSE SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)
END

END
创建函数dbo.fnpassessString
(
@第三节,
@分隔符字符,
@Text varchar(100)
)
返回VARCHAR(8000)
作为
开始
声明@NextPos SMALLINT,
@LastPos SMALLINT,
@找到SMALLINT
如果@Section>0
选择@Text=REVERSE(@Text)
选择@NextPos=CHARINDEX(@Delimiter,@Text,1),
@LastPos=0,
@发现=1
而@NextPos>0和ABS(@Section)@已找到
选择@LastPos=@NextPos,
@NextPos=CHARINDEX(@Delimiter、@Text、@NextPos+1),
@Found=@Found+1
回程箱
当@Found ABS(@Section)或@Section=0时,则为空
当@Section>0时,则反转(子字符串(@Text,@LastPos+1,当@NextPos=0时为大小写,然后是DATALENGTH(@Text)-@lastppos ELSE@NextPos-@LastPos-1 END))
ELSE子字符串(@Text,@LastPos+1,当@NextPos=0时为大小写,然后是DATALENGTH(@Text)-@lastppos ELSE@NextPos-@lastppos-1 END)
结束
结束
您可以参考此链接