我正在使用 SQL 2005。我希望有人可以帮助我修改此语句,以便它可以处理多个连续的零部分。此语句将 IPv6 地址转换为二进制。
假设您有这个 IPv6 地址:2001:db8:85a3:0000:0000:8a2e:370:7334。
可以将其重写为 2001:db8:85a3::8a2e:370:7334 以消除连续的零部分。
但是,下面的 SQL 语句只能处理上面的 IPv6 地址,如果它用完整的符号写成 2001:db8:85a3:0000:0000:8a2e:370:7334,给我一个二进制结果 0x20010DB885A3000000008A2E03707334。
如何修改以下语句,以便我可以处理写为 2001:db8:85a3::8a2e:370:7334 的 IPv6 地址?甚至是 ::1 之类的地址?
DECLARE @ipstr VARCHAR(50)
SET @ipstr = '2001:db8:85a3::0000:8a2e:370:7334'
SELECT CAST('' AS XML).value('xs:hexBinary( sql:column("y.ips") )', 'varbinary(16)')
FROM (
SELECT ips = (
SELECT RIGHT('0000' + SUBSTRING(ips, NUMBER, CHARINDEX(':', ips, NUMBER) - NUMBER), 4)
FROM master.dbo.spt_values
,(SELECT ips = ':' + @ipstr + ':') x
WHERE TYPE = 'P'
AND NUMBER BETWEEN 2 AND LEN(ips)
AND SUBSTRING(ips, NUMBER-1, 1) = ':'
FOR XML PATH('')
)
) y