Sql server 获取或计算T-SQL上的下一个IP地址
我有一个表来获取IP地址列表。我想获得/计算IP地址,前提是每个IP的最后一个子网或任何子网的+2数值。 我该怎么做 比如,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问题时,可以使用我刚刚编写的解决方案和光标: 这有点难看,但它可以工作。这可
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