4

SQL Serverデータベースからsignedintを取得していて、ユーザーに表示するために「通常の」外観の点線の文字列に変換する必要があります。

グーグル、私はこのコードを見つけました:

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ます。

助言がありますか?ありがとう。

4

3 に答える 3

9
DECLARE @IPADDRESS TABLE (
  IPADDRESS INT);

INSERT INTO @IPADDRESS
VALUES      (-1139627840),
            ( 1);

SELECT 
        LTRIM(CAST(SUBSTRING(IP,4,1) AS TINYINT)) + '.' + 
        LTRIM(CAST(SUBSTRING(IP,3,1) AS TINYINT)) + '.' + 
        LTRIM(CAST(SUBSTRING(IP,2,1) AS TINYINT)) + '.' + 
        LTRIM(CAST(SUBSTRING(IP,1,1) AS TINYINT))
FROM @IPADDRESS
CROSS APPLY (SELECT CAST(IPADDRESS AS BINARY(4))) C(IP)

ここに画像の説明を入力してください

于 2012-06-24T13:15:23.497 に答える
3

あなたが持っているコードIPADDRESSは、bigint(unsigned int表現をデータベースに効果的に格納する-つまり、すべての値> 0)の場合に機能します。テーブルのデータ型を変更するオプションはありますか?

作業する必要があるものを取得するには、bigintに変換する前に、signedintを同等のunsignedintに変換する必要があります。TSQLでこれを行う最も効率的な方法はわかりませんが、バイナリにキャストすることである可能性があります。

SELECT dbo.IPADDRESS.IPADDRESS,
CAST(ROUND( (cast(cast(dbo.IPADDRESS.IPADDRESS as binary(4)) as bigint) / 16777216 ), 0, 1) AS varchar(4)) + '.' +
CAST((ROUND( (cast(cast(dbo.IPADDRESS.IPADDRESS as binary(4)) as bigint) / 65536 ), 0, 1) % 256) AS varchar(4)) + '.' +
CAST((ROUND( (cast(cast(dbo.IPADDRESS.IPADDRESS as binary(4)) as bigint) / 256 ), 0, 1) % 256) AS varchar(4)) + '.' + 
CAST((cast(cast(dbo.IPADDRESS.IPADDRESS as binary(4)) as bigint) % 256 ) AS varchar(4)) as IPDottedNotation
于 2012-06-24T13:15:03.573 に答える
1

@Ed Harperが述べたように、選択したソリューションは署名されたintでは機能しません。以下は、キャストが少し少なくて済み、反転されない私のソリューションです。変換された文字列/varcharIPが192.168.18.188である以下に示す次のテストシナリオを確認してください。

CREATE TABLE #data
  (
     ip     NVARCHAR(45),
     before NVARCHAR(45)
  )

INSERT INTO #data
VALUES     ('converted-ip','-1139627840')

    update #data
    set ip = cast((cast(before as int) & 255) as nvarchar) + '.' +
         cast((cast(floor(convert(decimal, before)/256) as int) & 255) as nvarchar) + '.' +
         cast((cast(floor(convert(decimal, before)/65536) as int) & 255) as nvarchar) + '.' +
         cast((cast(floor(convert(decimal, before)/16777216) as int) & 255) as nvarchar)

select * from #data
于 2016-05-10T14:49:10.477 に答える