将signed int转换为SQL Server中的字符串IP地址

jal*_*rin 4 sql-server ip-address

我正在从SQL Server数据库中检索已签名的int,并需要将其转换为"正常"的点缀字符串以显示给用户.

谷歌搜索,我发现这个代码:

SELECT 
   dbo.IPADDRESS.IPADDRESS,
   CAST(ROUND( (cast(dbo.IPADDRESS.IPADDRESS as bigint) / 16777216 ), 0, 1) AS varchar(4)) + '.' +
   CAST((ROUND( (cast(dbo.IPADDRESS.IPADDRESS as bigint) / 65536 ), 0, 1) % 256) AS varchar(4)) + '.' +
   CAST((ROUND( (cast(dbo.IPADDRESS.IPADDRESS as bigint) / 256 ), 0, 1) % 256) AS varchar(4)) + '.' + 
   CAST((cast(dbo.IPADDRESS.IPADDRESS as bigint) % 256 ) AS varchar(4)) as IPDottedNotation
FROM  
   dbo.IPADDRESS
Run Code Online (Sandbox Code Playgroud)

它在某些时候有效,但在其他时候会产生古怪的输出.例如,转换它会-1951276725产生结果-116.-78.-30.-181.

有什么建议?谢谢.

Mar*_*ith 9

DECLARE @IPADDRESS TABLE (
  IPADDRESS INT);

INSERT INTO @IPADDRESS
VALUES      (-1139627840),
            ( 1);

SELECT 
        LTRIM(CAST(SUBSTRING(IP,4,1) AS TINYINT)) + '.' + 
        LTRIM(CAST(SUBSTRING(IP,3,1) AS TINYINT)) + '.' + 
        LTRIM(CAST(SUBSTRING(IP,2,1) AS TINYINT)) + '.' + 
        LTRIM(CAST(SUBSTRING(IP,1,1) AS TINYINT))
FROM @IPADDRESS
CROSS APPLY (SELECT CAST(IPADDRESS AS BINARY(4))) C(IP)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @jalperin`CROSS APPLY`将4字节整数转换为4字节二进制.然后将该表达式的结果别名为"IP".这只是为了避免需要重复四次转换为二进制.`SUBSTRING(IP,1,1)`从中提取第一个字节,`SUBSTRING(IP,2,1)`第二个,依此类推.这将在"0x00"到"0xFF"的范围内,强制转换为"tinyint"将其转换为十进制形式.`LTRIM`用于将结果转换为字符串,以便它可以连接成点状形式.比`CAST(CAST(SUBSTRING(IP,1,1)AS TINYINT)AS VARCHAR(3)更简洁 (2认同)