SQL Procedure BizLocator
 USE MyDatabase  /* Substitute your database name. */
 GO
 
 SET ANSI_NULLS ON
 GO
 SET QUOTED_IDENTIFIER ON
 GO
 
 
 
 ALTER PROCEDURE [dbo].[BizLocator]
     ( @Zipcode nvarchar(5) = '',
       @City varchar(128) = '',
       @State nvarchar(2) = '', 
       @MaxDisplay int = 5,
       @MaxDistance int = 200
     )
 
 AS
 
 DECLARE @Lat float
 DECLARE @Lon float
 DECLARE @ToRad float
 SET @ToRad = pi() / 180.0   
 
 IF @State = '0' OR @State = ''
     BEGIN
         SELECT @Lon = Longitude, @Lat = Latitude FROM Zipcodes WHERE Zipcode = @Zipcode
     END
 
 ELSE
     BEGIN
         SELECT @Lon = Longitude, @Lat = Latitude FROM Zipcodes WHERE City = @City AND Abbr = @State
     END
 
 
 
 CREATE TABLE #TempBiz(
     [ID] [int] NOT NULL,
     [Name] [nvarchar](max) NOT NULL,
     [Adr1] [nvarchar](max) NOT NULL,
     [Adr2] [nvarchar](max) NULL,
     [City] [nvarchar](max) NULL,
     [State] [nchar](2) NULL,
     [ZIP] [nchar](5) NULL,
     [AREA CODE] [nchar](3) NULL,
     [PHONE NO] [nchar](7) NULL,
     [A] [float] NULL,
     [B] [float] NULL,
     [C] [float] NULL
 ) ON [PRIMARY]
 
 
 INSERT INTO #TempBiz (ID, Name, Adr1, Adr2, City, State, ZIP, [Area Code], [Phone No], A, B, C)
 SELECT biz.*, 
        (sin(@Lat * @ToRad) * sin(zip.latitude * @ToRad) ) AS A,
        (cos(@Lat * @ToRad) * cos(zip.latitude * @ToRad)) AS B,
        (cos ( (@Lon - zip.longitude) * @ToRad) ) AS C
 FROM BizLocations biz
 JOIN ZipCodes zip
 ON (zip.zipcode = biz.zip)
 SET ROWCOUNT @MaxDisplay
 SELECT *, (3951.1329 * acos(A + B * C) ) AS Distance
 FROM #TempBiz
 WHERE (3951.1329 * acos(A + B * C) ) < @MaxDistance
 ORDER BY Distance
 
 DROP TABLE #TempBiz
 
 RETURN @Lat