2015-06-22 35 views
0

我試圖將IP地址從數字(例如4183726815)轉換爲MS SQL Server中的實際傳統IP顯示(例如192.168.1.230)。將IP的數字轉換爲傳統IP顯示

我發現了其他代碼(下面),但是然後我得到一個錯誤。

CREATE FUNCTION dbo.IntegerToIPAddress (@IP AS bigint) 

RETURNS varchar(15) 

AS 

BEGIN 

DECLARE @Octet1 tinyint 

DECLARE @Octet2 tinyint 

DECLARE @Octet3 tinyint 

DECLARE @Octet4 tinyint 

DECLARE @RestOfIP bigint 

SET @Octet1 = @IP/16777216 

SET @RestOfIP = @IP - (@Octet1 * 16777216) 

SET @Octet2 = @RestOfIP/65536 

SET @RestOfIP = @RestOfIP - (@Octet2 * 65536) 

SET @Octet3 = @RestOfIP/256 

SET @Octet4 = @RestOfIP - (@Octet3 * 256) 

RETURN(CONVERT(varchar, @Octet1) + '.' + 

CONVERT(varchar, @Octet2) + '.' + 

CONVERT(varchar, @Octet3) + '.' + 

CONVERT(varchar, @Octet4)) 

END 

當我運行

SELECT dbo.IntegerToIPAddress(2130806436) 

它返回127.1.134.164。這正是需要的。

然而,當我運行數據IP的,我得到以下錯誤: 如

SELECT dbo.IntegerToIPAddress2(3232235780) 

Arithmetic overflow error converting expression to data type int.

任何想法?或者我應該從上面的代碼嘗試另一種方法嗎?

謝謝大家! :)

回答

0

變化變量聲明從TinyintBigint爲:

DECLARE @Octet1 bigint 

DECLARE @Octet2 bigint 

DECLARE @Octet3 bigint 

DECLARE @Octet4 bigint 
+0

你好Deepshikha,這是訣竅!非常感謝你的幫助! :) – Fred

1

線: SET @RestOfIP = @IP - (@那麼字節1 * 16777216)

是治療恆定16777216作爲int,然後期望乘法結果爲int。你需要告訴它它會是bigint。

SET @RestOfIP = @IP - (@Octet1 * CONVERT(bigint, 16777216)) 
+0

嗨bitflipper,我試過你的建議以及Deepshika的,並且都很好。謝謝你的幫助! :) – Fred

+0

@Deepshikha的答案可能是更正確的答案,因爲它消除了我的答案希望特別強調的隱式轉換。 – bitflipper