只是简单的写一下,没考虑复杂的a类b类c类的复杂判定create function f_cip(@ip varchar(30),@mask int)
returns varchar(100)
as
begin
declare @i int
    set @i = 1
set @mask = 256 - @mask
    while power(2,@I) < @mask
        set @i = @I + 1
set @mask = power(2,@i)
    return @ip +'------'+   left(@ip,len(@ip) -  charindex('.',reverse(@ip)) +1) + ltrim(@mask)
end
go
declare @ip varchar(30)
declare @m int
set @m = 24
set @ip = '192.168.0.0'
select dbo.f_cip(@ip,@m)drop function f_cip/*
---------------------------------------------------------------------------------------------------- 
192.168.0.0------192.168.0.256(所影响的行数为 1 行)*/

解决方案 »

  1.   

    这个问题太强了..
    记得考ccna时,这问题我都是写成010101去算..
      

  2.   

    create function f_cip(@ip varchar(30),@mask int)
    returns varchar(300)
    as
    begin
    declare @i int,@ret varchar(300)
        set @i = 1
    set @mask = 256 - @mask
        while power(2,@I) < @mask
            set @i = @I + 1
    set @mask = power(2,@i)
        set @i = 256/@mask
        if @i = 1 
    --    if @mask = 256
            set @ret =  @ip +'------'+   left(@ip,len(@ip) -  charindex('.',reverse(@ip)) +1) + ltrim(@mask)
        else
            while @i > 0 
            begin
                set @ret =isnull(@ret+char(13),'')+'192.168.0.'+right('000'+ltrim((@i-1)*@mask),3) + '-----'+'192.168.0.'+ltrim(@i*@mask - 1)
                set @I  = @I- 1
            end
        return @ret
        
            
    end
    go
    declare @ip varchar(30)
    declare @m int
    set @m = 200
    set @ip = '192.168.0.0'
    select dbo.f_cip(@ip,@m) as '所有子网'drop function f_cip/*
    所有子网              
    -----------------------------------
    192.168.0.192-----192.168.0.255
    192.168.0.128-----192.168.0.191
    192.168.0.064-----192.168.0.127
    192.168.0.000-----192.168.0.63(所影响的行数为 1 行)*/
      

  3.   

    再优化一下:create function f_cip(@ip varchar(30),@mask int)
    returns varchar(300)
    as
    begin
    declare @i int,@ret varchar(300)
        set @i = 1
    set @mask = 256 - @mask
        while power(2,@I) < @mask
            set @i = @I + 1
    set @mask = power(2,@i)
        set @i = 256/@mask
       
        while @i > 0 
        begin
            set @ret =isnull(@ret+char(13),'')+'192.168.0.'+right('000'+ltrim((@i-1)*@mask),3) + '-----'+'192.168.0.'+ltrim(@i*@mask - 1)
            set @I  = @I- 1
        end
        return @ret
        
            
    end
    go
    declare @ip varchar(30)
    declare @m int
    set @m = 200
    set @ip = '192.168.0.0'
    select dbo.f_cip(@ip,@m) as '所有子网'drop function f_cip/*
    所有子网              
    -----------------------------------
    192.168.0.192-----192.168.0.255
    192.168.0.128-----192.168.0.191
    192.168.0.064-----192.168.0.127
    192.168.0.000-----192.168.0.63(所影响的行数为 1 行)*/