繁体   English   中英

如何在SQL Server中将IPv6地址从十进制数字字符串转换为两个bigints?

[英]How to convert an IPv6 address from decimal number string to two bigints in SQL Server?

我有一个包含要尝试批量导入到sql server表中的IPv6地址的CSV文件。 CSV文件中的地址示例可能是“ 558282959301147147248235258744685685608464”。 我希望将IP地址存储到数据库中的两个bigint中,因为SQL bigint只能处理64位,而IPv6地址需要128位。 我用于处理IPV4地址的导入代码是:

SET @sql = '
    INSERT INTO dbo.IPCountry
    SELECT
        REPLACE(ipFROM, ''"'', '''') AS ipFROM,
        REPLACE(ipTO, ''"'', '''') AS ipTO,
        CAST(REPLACE(countrySHORT, ''"'', '''') AS CHAR(2)) AS countrySHORT
    FROM OPENROWSET(
        BULK ''' + @Directory + 'IPCountry.csv'',
        FORMATFILE = ''' + @Directory + 'IPCountry.Xml''
    ) AS t1
';
exec sp_executesql @sql;

如何将128位IPv6值转换为两个bigint值?

根据您的示例,该示例正好是一个38个数字的字符串,我将其分成两半,并将每一半都转换为BIGINT组件。

这是演示该过程并将其逆转的示例:

-- Prepare test variables
DECLARE @Source AS NVARCHAR(38)
DECLARE @ipFROMa AS BIGINT
DECLARE @ipFROMb AS BIGINT
DECLARE @Destination AS NVARCHAR(38)

SET @Source = '55828295930114724823525874468560830464'

-- Split Source into TWO strings and then each into a BIGINT
SET @ipFROMa = (SELECT CAST(SUBSTRING(@Source,1,19) AS BIGINT))
SET @ipFROMb = (SELECT CAST(SUBSTRING(@Source,20,19) AS BIGINT))

-- Test returning BIGINTs into one IPv6 string
SET @Destination = (SELECT 
                        CAST( 
                            CAST(@ipFROMa AS NVARCHAR(19)) +
                            CAST(@ipFROMb AS NVARCHAR(19))
                             AS nvarchar(38)))

-- Display the values for verification
SELECT @Source, @ipFROMa, @ipFROMb, @Destination

结果:

55828295930114724823525874468560830464 5582829593011472482 3525874468560830464 55828295930114724823525874468560830464

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM