SQL Server 2014.
TL DR Мне нужно иметь возможность запрашивать между диапазонами IP в поле VARBINARY (16), но при первом запросе я получаю неправильный результатзапустить, тогда как я получаю правильный результат при повторном запуске запроса во второй раз.Почему это происходит?
Я пытаюсь получить данные IPGeoLocation, где поставщик данных предоставляет широту и долготу по диапазону IP (IPv4 и IPv6).Необработанный диапазон IP-адресов (т. Е. Начало и конец) сохраняется как VARCHAR (39) вместе с шестнадцатеричным преобразованием как VARBINARY (16), что было выполнено как ОБНОВЛЕНИЕ таблицы с использованием CONVERT (VARBINARY (16), IpStart),Это означает, что всего четыре столбца.Есть два поставщика данных, которые я проверяю, чтобы увидеть, каковы фактические результаты, поэтому есть две таблицы с данными IPGeolocation.Кроме того, в каждой таблице есть два некластеризованных столбца, которые охватывают столбцы VARCHAR (39) и столбцы VARBINARY (16).
Я получаю противоречивый ответ от SQL Server на одного из поставщиков данных, когдаЯ запрашиваю диапазон адресов между VARCHAR (39) и VARBINARY (16).Теперь вот кикер, я конвертирую VARCHAR (39) в VARBINARY (16) на лету, используя CONVERT (VARBINARY (16), IpStart).Я ожидаю, что два запроса вернут одинаковые результаты.Однако при первом запуске результаты отличаются, если запрос МЕЖДУ шестнадцатеричными столбцами неверен.Но когда я перезапущу запрос, выходные данные столбца Hex совпадают.Зачем?Это проблема кэширования в SQL Server?Это возможная ошибка?Кто-нибудь сталкивался с этой проблемой?
DECLARE @RowKey INT
,@Ip VARCHAR(39) = '2600:1011:b152:d4aa:b158:af57:d0d8:ef6d'
DECLARE @IpHex VARBINARY(16) = CONVERT(VARBINARY(16), @Ip)
,@RowKeyHex INT
SELECT @RowKey = RowKey
FROM IpGeoLocation
WHERE ProtocolKey = 7 -- 'IPV4' = 6 & 'IPV6' = 7
AND CONVERT(VARBINARY(16), @Ip) BETWEEN CONVERT(VARBINARY(16), NetworkStartIp) AND CONVERT(VARBINARY(16), NetworkEndIp)
SELECT @RowKeyHex = RowKey
FROM IpGeoLocation
WHERE ProtocolKey = 7 -- 'IPV4' = 6 & 'IPV6' = 7
AND @IpHex BETWEEN NetworkStartIphex AND NetworkEndIphex
SELECT @Ip, @IpHex
,RowKey, ProtocolKey, ProtocolId, Latitude, Longitude, NetworkStartIp, NetworkEndIp, NetworkStartIpHex, NetworkEndIpHex
FROM IpGeoLocation
WHERE RowKey = @RowKey
SELECT @Ip, @IpHex
,RowKey, ProtocolKey, ProtocolId, Latitude, Longitude, NetworkStartIp, NetworkEndIp, NetworkStartIpHex, NetworkEndIpHex
FROM IpGeoLocation
WHERE RowKey = @RowKeyHex
Результат: