Convertir signé int string adresse ip dans SQL Server
Je suis à la récupération d'un signé int à partir d'une base de données SQL Server et le besoin de la convertir en "normal" à la recherche en pointillés chaîne de caractères pour l'affichage des utilisateurs.
Recherche sur google, j'ai trouvé ce code:
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
qui fonctionne de temps en temps, mais produit loufoque de sortie d'autres moments. Par exemple, la conversion de ce -1951276725
donne le résultat -116.-78.-30.-181
.
Des suggestions? Merci.
OriginalL'auteur jalperin | 2012-06-24
Vous devez vous connecter pour publier un commentaire.
Je suis un MSSQL débutant et j'ai du mal à comprendre ce qui se passe ici. Quelqu'un est-il prêt à "parler" de moi à travers.
Le
CROSS APPLY
jette le 4 octets entier de 4 octets binaires. Le résultat de cette expression est ensuite aliasIP
. C'est tout simplement pour éviter d'avoir à répéter la distribution binaire à quatre reprises. LeSUBSTRING(IP,1,1)
extraits du premier octet,SUBSTRING(IP,2,1)
la deuxième et ainsi de suite. Ce sera dans la gamme0x00
à0xFF
le casting detinyint
la convertit en une forme décimale. LeLTRIM
permet de convertir le résultat de la chaîne de sorte qu'il peut être concaténées dans la forme pointillée. Plus concis queCAST(CAST(SUBSTRING(IP,1,1) AS TINYINT) AS VARCHAR(3))
Bonne explication, merci! Juste un point de plus: Si l'intégralité de cette déclaration peut être branché dans mon SELECT réelle? (Je suis habitué à voir DE toujours être utilisé avec un nom de table, de sorte que l'utilisation d'un nom de colonne, il m'ont troublé.)
Oui, le
FROM dbo.IPADDRESS
est la référence à votre table. LeSELECT
dans leCROSS APPLY
fait référence à la colonne.OriginalL'auteur Martin Smith
Le code que vous avez si
IPADDRESS
était un bigint (efficacement le stockage de la unsigned int représentation dans la base de données - c'est à dire toutes les valeurs > 0). Vous avez la possibilité de changer le type de données dans la table?Pour obtenir ce que vous avez à travailler, vous avez besoin de convertir votre signée int pour l'équivalent unsigned int avant la conversion de type bigint. Je ne suis pas sûr de ce que le moyen le plus efficace pour ce faire, dans TSQL est, mais il pourrait être pour le convertir en binaire:
IP octets sont pour quelque raison inversé dans mon cas, mais pas de problème. Fonctionne très bien
OriginalL'auteur Ed Harper
Comme @Ed Harper a déclaré que la solution choisie ne fonctionne pas signé int. Ci-dessous est ma solution qui nécessite un peu moins de la coulée et n'est pas inversé. Découvrez le scénario de test suivant indiqué ci-dessous où la chaîne convertie/varchar IP doit être 192.168.18.188:
OriginalL'auteur CaMiX