Я извлекаю подписанный int из базы данных SQL Server и должен преобразовать его в «обычную» строку с точками для отображения пользователям.Преобразование подписанного int для строкового ip-адреса в SQL Server
Googling, я нашел этот код:
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
который работает некоторое время, но производит дурацкие выходные другие времена. Например, преобразование этого -1951276725
дает результат -116.-78.-30.-181
.
Любые предложения? Благодарю.
+1 намного более аккуратный, чем код OP –
Я новичок MSSQL, и я изо всех сил пытаюсь понять, что здесь происходит. Кто-нибудь хочет «рассказать» меня. – jalperin
@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))' –