Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 获取或计算T-SQL上的下一个IP地址_Sql Server_Tsql_Ip Address - Fatal编程技术网

Sql server 获取或计算T-SQL上的下一个IP地址

Sql server 获取或计算T-SQL上的下一个IP地址,sql-server,tsql,ip-address,Sql Server,Tsql,Ip Address,我有一个表来获取IP地址列表。我想获得/计算IP地址,前提是每个IP的最后一个子网或任何子网的+2数值。 我该怎么做 比如, SELECT * FROM tblDevices 图片: 就这样, 10.0.128.14->10.0.128.16 10.0.128.140->10.0.128.142 10.0.128.141->10.0.128.143 10.0.128.142->10.0.128.144 当您想处理255问题时,可以使用我刚刚编写的解决方案和光标: 这有点难看,但它可以工作。这可

我有一个表来获取IP地址列表。我想获得/计算IP地址,前提是每个IP的最后一个子网或任何子网的+2数值。 我该怎么做

比如,

SELECT * FROM tblDevices
图片:

就这样,

10.0.128.14->10.0.128.16

10.0.128.140->10.0.128.142

10.0.128.141->10.0.128.143

10.0.128.142->10.0.128.144

当您想处理255问题时,可以使用我刚刚编写的解决方案和光标:


这有点难看,但它可以工作。

这可以使用基于数字的表格工作

declare @string varchar(20)
set @string='.10.0.128.14.'

;with cte
as
(
select 
substring(@string,n+1,charindex('.',@string,n+1)-n-1) as b,row_number() over (order by (select 1)) as rn
from numbers
where 
substring(@string,n,1)='.'
and n<len(@string)
)
select 
distinct stuff((select '.'+case when rn =(select max(rn) from cte) then convert(varchar(10),b+2) else convert(varchar(10),b) end
from cte for xml path('')),1,1,'') b
 from cte
输出:10.0.128.16

根据评论更新:

输出:192.168.2.1


您能否以文本形式提供示例数据?否则,就不可能从中派生出sql FIDLE。链接有时也会腐烂。我添加了文本样本数据。只有IP_地址列。您是在哪里指定子网掩码,还是仅假设为/24?你在乎结果是广播地址.255还是荒谬的.256?IPV6?对于SQL来说,获取下一个有效地址有点过分。只需在最后一个八位字节上加上2,您就可以从diiN_u2;得到答案。检查我的答案,它使用一个数字表来完成任务Thank you@diiN_2;它可以工作,但如果最后一个八位字节是255,则结果是错误的。正如哈博所说,我关心你的处境。如果ip地址为192.168.1.255,则下一个ip地址为192.168.2。1@JuniorDeveloper我刚才投票支持这个答案。这不是一个简单的.255的情况。你想解决什么问题?@Frisbee我试过编辑diiN_的答案,它对我有效。@JuniorDeveloper,你知道你正在访问一个子网吗?@Frisbee是的,我知道。也许在我的IP表上任何时候都不会出现.255的情况。我只是想知道如何根据一些条件来操作/计算下一个IP地址。你考虑了255个问题吗?谢谢大家的帮助。这些答案对我很有用。
DECLARE @IP_Address VARCHAR(30)
DECLARE MY_CURSOR CURSOR LOCAL READ_ONLY FAST_FORWARD
FOR
SELECT IP_Address
FROM tblDevices
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @IP_Address
WHILE @@FETCH_STATUS = 0
BEGIN
    IF(CAST(PARSENAME(@IP_Address, 1) AS INT) IN (254, 255))
    BEGIN
        IF(CAST(PARSENAME(@IP_Address, 2) AS INT) = 255)
        BEGIN
            IF(CAST(PARSENAME(@IP_Address, 3) AS INT) = 255)
            BEGIN
                IF(CAST(PARSENAME(@IP_Address, 4) AS INT) = 255)
                BEGIN
                    SELECT '255.255.255.255'
                END
                ELSE
                    SELECT
                        CASE WHEN CAST(PARSENAME(@IP_Address, 1) AS INT) = 254 THEN (CAST(PARSENAME(@IP_Address, 4) AS INT) + 1) + '.0.0.1'
                        ELSE (CAST(PARSENAME(@IP_Address, 4) AS INT) + 1) + '.0.0.2' END
            END
            ELSE
                SELECT
                    CASE WHEN CAST(PARSENAME(@IP_Address, 1)AS INT) = 254 THEN PARSENAME(@IP_Address, 4) + '.' + CONVERT(VARCHAR(5), (PARSENAME(@IP_Address, 3)) + 1) + '.0.1'
                    ELSE PARSENAME(@IP_Address, 4) + '.' + CONVERT(VARCHAR(5), (PARSENAME(@IP_Address, 3)) + 1) + '.0.2' END
        END
        ELSE
            SELECT
                CASE WHEN CAST(PARSENAME(@IP_Address, 1) AS INT) = 254 THEN PARSENAME(@IP_Address, 4) + '.' + PARSENAME(@IP_Address, 3) + '.' + CONVERT(VARCHAR(5), (PARSENAME(@IP_Address, 2) + 1)) + '.1'
                ELSE PARSENAME(@IP_Address, 4) + '.' + PARSENAME(@IP_Address, 3) + '.' + CONVERT(VARCHAR(5), (PARSENAME(@IP_Address, 2)) + 1) + '.2' END
    END
    ELSE
        SELECT PARSENAME(@IP_Address, 4) + '.' + PARSENAME(@IP_Address, 3) + '.' + PARSENAME(@IP_Address, 2) + '.' + CONVERT(VARCHAR(5), (PARSENAME(@IP_Address, 1) + 2))

    FETCH NEXT FROM MY_CURSOR INTO @IP_Address
END
declare @string varchar(20)
set @string='.10.0.128.14.'

;with cte
as
(
select 
substring(@string,n+1,charindex('.',@string,n+1)-n-1) as b,row_number() over (order by (select 1)) as rn
from numbers
where 
substring(@string,n,1)='.'
and n<len(@string)
)
select 
distinct stuff((select '.'+case when rn =(select max(rn) from cte) then convert(varchar(10),b+2) else convert(varchar(10),b) end
from cte for xml path('')),1,1,'') b
 from cte
declare @string varchar(20)
set @string='.192.168.1.255.'

;with cte
as
(

select 
substring(@string,n+1,charindex('.',@string,n+1)-n-1) as b,row_number() over (order by (select 1)) as rn
from numbers
where 
substring(@string,n,1)='.'
and n<len(@string)
)
select
 stuff((select '.'+
case 
when rn =(select max(rn) from cte)  and b=255
then convert(varchar(10),1) 

----
when rn=(select max(rn)-1 from cte)  and ((select b from cte where rn=(select max(rn) from cte))=255)
then convert(varchar(10),b+1)

when rn =(select max(rn) from cte)  
then convert(varchar(10),b+2) else convert(varchar(10),b) 
end
from cte for xml path('')),1,1,'') b,rn,b
 from cte
 where rn=1