February 12, 2011

SQL Server: Store and Retrieve IP Address

We can store IP addresses in SQL Server in a varchar column. However to retrieve IP address for a specific range, we need to split each part and compare it.

Consider the following table:

SQL Server IP Address

Suppose we want to retrieve all the IP addresses that fall in the range from
to The following query will retrieve these IP addresses:

SQL Server IP Address

Here’s the same query for you to try out:

declare @from_ip varchar(20), @to_ip varchar(20)

select @from_ip='',@to_ip=''

select * from @t
parsename(Ip_address,4)*1>= parsename(@from_ip ,4)*1 and
parsename(Ip_address,4)*1<= parsename(@to_ip ,4)*1
parsename(Ip_address,3)*1>= parsename(@from_ip ,3)*1 and
parsename(Ip_address,3)*1<= parsename(@to_ip ,3)*1
parsename(Ip_address,2)*1>= parsename(@from_ip ,2)*1 and
parsename(Ip_address,2)*1<= parsename(@to_ip ,2)*1
parsename(Ip_address,1)*1>= parsename(@from_ip ,1)*1 and
parsename(Ip_address,1)*1<= parsename(@to_ip ,1)*1

In the query shown above, the Parsename function is used split IP addresses based on a dot (.) . As the IP address is stored in a varchar data type, we need to convert to integer to do calculations. Multiplying it by 1 will convert the varchar number to Integer


Did you like this post?
kick it on DotNetKicks.com
subscribe via rss subscribe via e-mail
print this post follow me on twitter

About The Author

Madhivanan,an MSc computer Science graduate from Chennai-India, works as a works as a Lead Subject Matter Expert at a company that simplifies BIG data. He started his career as a developer working with Visual Basic 6.0, SQL Server 2000 and Crystal Report 8. As years went by, he started working more on writing queries in SQL Server. He now has good level of knowledge in SQLServer, Oracle, MySQL and PostgreSQL as well. He is also one of the leading posters at www.sqlteam.com and a moderator at www.sql-server-performance.com. His T-sql blog is at http://beyondrelational.com/blogs/madhivanan



5 Responses to "SQL Server: Store and Retrieve IP Address"
  1. Ovidiu Curcan said...
    February 17, 2011 at 2:37 AM

    You should store your IP addresses as integers in the database. That way "from to" becomes "from 3232266360 to 3232286975".

  2. James said...
    February 17, 2011 at 1:31 PM

    I don't think your method scales very well. You also cannot convert your method to a function as PARSENAME is not a deterministic function in sql.

    Try this for multiple alternatives.


  3. Madhivanan said...
    February 18, 2011 at 12:08 AM

    James, non deterministics functions like parsename, getdate() as re allowed in user defined function from version 2005 onwards

  4. James said...
    February 24, 2011 at 3:15 AM

    Yeah sorry they are. However you cannot use a non deterministic function in a pre computed field what is really what I mean to say.

    If you have a function that is deterministic you can then create a computed field on the ip address and add an index to it. Thus speeding the range searches by massive amounts

  5. monpara.sanjay said...
    January 22, 2015 at 3:54 AM

    For ipv4:


Copyright © 2009-2016 All Rights Reserved for SQLServerCurry.com by Suprotim Agarwal | Terms and Conditions