Несовместимые ответы SQL - PullRequest
       20

Несовместимые ответы SQL

0 голосов
/ 25 февраля 2019

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

Результат:

enter image description here

...