Sql server Google Geocode API在SQL Server中不返回响应,但在浏览器中返回有效地址的有效XML响应

Sql server Google Geocode API在SQL Server中不返回响应,但在浏览器中返回有效地址的有效XML响应,sql-server,xml,google-maps,http,geocoding,Sql Server,Xml,Google Maps,Http,Geocoding,我的地址是宾夕法尼亚州伯利恒林登街3926号,邮编18020,在SQL Server 2016中使用谷歌地理编码API进行地理编码。这是一个有效地址,我用来打开HTTP请求的URL是 https://maps.googleapis.com/maps/api/geocode/xml?address=3926+林登街+伯利恒+PA+18020&key=MY_API_key 我的SQL Server SP代码为 CREATE PROCEDURE [dbo].[spGeocode] @Address

我的地址是宾夕法尼亚州伯利恒林登街3926号,邮编18020,在SQL Server 2016中使用谷歌地理编码API进行地理编码。这是一个有效地址,我用来打开HTTP请求的URL是

https://maps.googleapis.com/maps/api/geocode/xml?address=3926+林登街+伯利恒+PA+18020&key=MY_API_key

我的SQL Server SP代码为

CREATE PROCEDURE [dbo].[spGeocode]
 @Address varchar(80) = NULL OUTPUT,
 @City varchar(40) = NULL OUTPUT,
 @State varchar(40) = NULL OUTPUT,
 @Country varchar(40) = NULL OUTPUT,
 @PostalCode varchar(20) = NULL OUTPUT,

 @County varchar(40) = NULL OUTPUT,

 @GPSLatitude numeric(9,6) = NULL OUTPUT,
 @GPSLongitude numeric(9,6) = NULL OUTPUT,
 @MapURL varchar(1024) = NULL OUTPUT

 AS
 BEGIN
 SET NOCOUNT ON

 DECLARE @URL varchar(MAX)
 SET @URL = 'https://maps.googleapis.com/maps/api/geocode/xml?address=' +
 CASE WHEN @Address IS NOT NULL THEN @Address ELSE '' END +
 CASE WHEN @City IS NOT NULL THEN ', ' + @City ELSE '' END +
 CASE WHEN @State IS NOT NULL THEN ', ' + @State ELSE '' END +
 CASE WHEN @PostalCode IS NOT NULL THEN ', ' + @PostalCode ELSE '' END +
 CASE WHEN @Country IS NOT NULL THEN ', ' + @Country ELSE '' END +
 '&key=MY_API_KEY'
 SET @URL = REPLACE(@URL, ' ', '+')

 DECLARE @Response varchar(8000)
 DECLARE @XML xml
 DECLARE @Obj int 
 DECLARE @Result int 
 DECLARE @HTTPStatus int 
 DECLARE @ErrorMsg varchar(MAX)

 EXEC @Result = sp_OACreate 'MSXML2.ServerXMLHttp', @Obj OUT 



 BEGIN TRY
 EXEC @Result = sp_OAMethod @Obj, 'open', NULL, 'GET', @URL, false

 EXEC @Result = sp_OAMethod @Obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'

 EXEC @Result = sp_OAMethod @Obj, send, NULL, ''

 EXEC @Result = sp_OAGetProperty @Obj, 'status', @HTTPStatus OUT 

 EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml', @Response OUT 

 END TRY
 BEGIN CATCH
 SET @ErrorMsg = ERROR_MESSAGE()
 END CATCH

 EXEC @Result = sp_OADestroy @Obj

 IF (@ErrorMsg IS NOT NULL) OR (@HTTPStatus <> 200) 
 BEGIN
 SET @ErrorMsg = 'Error in spGeocode: ' + ISNULL(@ErrorMsg, 'HTTP result is: ' + CAST(@HTTPStatus AS varchar(10)))
 RAISERROR(@ErrorMsg, 16, 1, @HTTPStatus)
 RETURN 
 END

 SET @XML = CAST(@Response AS XML)

 SET @GPSLatitude = @XML.value('(/GeocodeResponse/result/geometry/location/lat) [1]', 'numeric(9,6)')
 SET @GPSLongitude = @XML.value('(/GeocodeResponse/result/geometry/location/lng) [1]', 'numeric(9,6)')

 SET @City = ISNULL(
             ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="locality"]/long_name) [1]', 'varchar(40)'), 
                    @XML.value('(/GeocodeResponse/result/address_component[type="neighborhood"]/long_name) [1]', 'varchar(40)')
                    )
                    ,
                    @XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_3"]/long_name) [1]', 'varchar(40)')
                    )

 SET @State = @XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_1"]/short_name) [1]', 'varchar(40)') 
 SET @PostalCode = @XML.value('(/GeocodeResponse/result/address_component[type="postal_code"]/long_name) [1]', 'varchar(20)') 
 SET @Country = @XML.value('(/GeocodeResponse/result/address_component[type="country"]/short_name) [1]', 'varchar(40)') 
 SET @County = @XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_2"]/short_name) [1]', 'varchar(40)') 

 SET @Address = ISNULL((@XML.value('(/GeocodeResponse/result/address_component[type="street_number"]/long_name) [1]', 'varchar(40)') + 
                        ' ' +
                        @XML.value('(/GeocodeResponse/result/address_component[type="route"]/long_name) [1]', 'varchar(40)')
                        )
                        ,
                        @XML.value('(/GeocodeResponse/result/formatted_address) [1]', 'varchar(100)')
                        )

 SET @MapURL = 'https://maps.google.com/maps?f=q&hl=en&q=' + CAST(@GPSLatitude AS varchar(20)) + '+' + CAST(@GPSLongitude AS varchar(20))

 
 SELECT 
 @GPSLatitude AS GPSLatitude,
 @GPSLongitude AS GPSLongitude,
 @City AS City,
 @State AS [State],
 @PostalCode AS PostalCode,
 @Address AS [Address],
 @County AS County,
 @MapURL AS MapURL,
 @XML AS XMLResults


END
GeocodeAPI没有通过上述SP提供响应,但当我在浏览器中输入整个URL时,它显示了有效的XML响应。还有许多其他有效地址遇到相同问题。SQLServerSP显示HTTP请求状态为200,但根本没有错误消息,响应为NULL,我认为这意味着没有给出响应

更新-此问题仅发生在Google Geocodes API返回超过1个结果段的地址上。在这种情况下,responseXML.xml将变为NULL


我想知道如何解决这个问题。

我终于解决了

仅当特定地址返回
GeocodeResponses
下的多个
result
元素时,才会发生这种情况。发生这种情况时,要写入
@Response
变量的
responseXML.xml
的大小

EXEC@Result=sp_OAGetProperty@Obj,'responseXML.xml',@Response OUT

超过了
@Response VARCHAR(8000)
的预设长度,因此根本不会将任何内容写入
@Response
,这导致
@HTTPStatus
为200,但没有
@ErrorMsg
@Response

解决方案是将响应的XML数据写入临时表或表变量,而不是将它们保存在VARCHAR中。修改后的代码应该是(如果使用临时表)在提取responseXML.xml之前创建临时表,然后将响应写入该临时表

ALTER PROCEDURE [dbo].[spAddressSearch]
 --Define input/output variables
 @Address varchar(80) = NULL OUTPUT,
 @City varchar(40) = NULL OUTPUT,
 @State varchar(40) = NULL OUTPUT,
 @Country varchar(40) = NULL OUTPUT,
 @PostalCode varchar(20) = NULL OUTPUT,
 @County varchar(40) = NULL OUTPUT,
 @GPSLatitude numeric(9,6) = NULL OUTPUT,
 @GPSLongitude numeric(9,6) = NULL OUTPUT,
 @MapURL varchar(3000) = NULL OUTPUT

 AS
 BEGIN
 SET NOCOUNT ON

 DECLARE @OrigAddress VARCHAR(80);
 SET @OrigAddress = @Address -- Create a separate address variable to future output

 --Define Google Geocoding API URL to look up for
 DECLARE @URL varchar(3000)
 SET @URL = 'https://maps.google.com/maps/api/geocode/xml?&address=' +
            CASE WHEN @Address IS NOT NULL THEN @Address ELSE '' END +
            CASE WHEN @City IS NOT NULL THEN ', ' + @City ELSE '' END +
            CASE WHEN @State IS NOT NULL THEN ', ' + @State ELSE '' END +
            CASE WHEN @PostalCode IS NOT NULL THEN ', ' + @PostalCode ELSE '' END +
            CASE WHEN @Country IS NOT NULL THEN ', ' + @Country ELSE '' END +
            '&key=MY_API_KEY' --This key must be generated on Google Cloud Platform first
 SET @URL = REPLACE(@URL, ' ', '+')


 --Prepare for HTTP request 
 DECLARE @XML xml
 DECLARE @Obj int 
 DECLARE @Result int 
 DECLARE @HTTPStatus int 
 DECLARE @ErrorMsg varchar(8000)

 EXEC @Result = sp_OACreate 'MSXML2.ServerXMLHttp', @Obj OUT 

 --Create a temp table to hold XML values returned. 
 --Due to the size of XML values exceed VARCHAR(8000) for a number of stores returned, it must be stored in a table (or table variable).
 IF OBJECT_ID('tempdb..#xml') IS NOT NULL DROP TABLE #xml
 CREATE TABLE #xml ( XMLValue XML )

 --Send HTTP request
 BEGIN TRY
     EXEC @Result = sp_OAMethod @Obj, 'open', NULL, 'GET', @URL, 'false'
     EXEC @Result = sp_OAMethod @Obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
     EXEC @Result = sp_OAMethod @Obj, send, NULL, ''
     EXEC @Result = sp_OAGetProperty @Obj, 'status', @HTTPStatus OUT 
     -- Cast value to the temp table created earlier
     INSERT  #xml (XMLValue)
     EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml'--
 
  
 END TRY
 BEGIN CATCH --See if there is bad request
    SET @ErrorMsg = ERROR_MESSAGE()
 END CATCH
 EXEC @Result = sp_OADestroy @Obj

 --Error handling: output bad data to the same table
 IF (@ErrorMsg IS NOT NULL) OR (@HTTPStatus <> 200) 
 BEGIN

     SET @GPSLatitude = 999.999999
     SET @GPSLongitude = 999.999999
     SET @City = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @State = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @PostalCode = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @Country = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @County = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @Address = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @MapURL = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @XML = (SELECT XMLValue FROM #XML)

     SELECT 
     @OrigAddress AS OriginalAddress,
     @GPSLatitude AS GPSLatitude,
     @GPSLongitude AS GPSLongitude,
     @City AS City,
     @State AS [State],
     @PostalCode AS PostalCode,
     @Address AS [Address],
     @County AS County,
     @MapURL AS MapURL,
     @XML AS XMLResults

     SET @ErrorMsg = 'Error in spGeocode: ' + ISNULL(@ErrorMsg, 'HTTP result is: ' + CAST(@HTTPStatus AS varchar(10)))

 END

 --If no error raised and status = 200- meaning the request is captured OK
 IF (@ErrorMsg IS NULL) AND (@HTTPStatus = 200) 
 BEGIN
     DECLARE @TempAddress VARCHAR(500)
     
     SET @XML = (SELECT XMLValue FROM #XML)
     SET @GPSLatitude = ISNULL(@XML.value('(/GeocodeResponse/result/geometry/location/lat) [1]', 'numeric(9,6)'),999.999999)
     SET @GPSLongitude = ISNULL(@XML.value('(/GeocodeResponse/result/geometry/location/lng) [1]', 'numeric(9,6)'),999.999999)
     SET @City = ISNULL(
                 ISNULL(
                 ISNULL(
                 ISNULL(
                 ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="locality"]/long_name) [1]', 'varchar(40)'), 
                        @XML.value('(/GeocodeResponse/result/address_component[type="sublocality"]/long_name) [1]', 'varchar(40)')),
                        @XML.value('(/GeocodeResponse/result/address_component[type="neighborhood"]/long_name) [1]', 'varchar(40)')),
                        @XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_3"]/short_name) [1]', 'varchar(40)')),
                        @XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_1"]/short_name) [1]', 'varchar(40)')),
                        'Not Found in Google Maps')
     SET @State = ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_1"]/short_name) [1]', 'varchar(40)'), 'Not Found in Google Maps') 
     SET @PostalCode = ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="postal_code"]/long_name) [1]', 'varchar(20)'), 'Not Found in Google Maps') 
     SET @Country = ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="country"]/short_name) [1]', 'varchar(40)'), 'Not Found in Google Maps') 
     SET @County = ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_2"]/short_name) [1]', 'varchar(40)'),'Not Found in Google Maps')
     
     SET @Address = ISNULL(ISNULL(
                           @XML.value('(/GeocodeResponse/result/formatted_address) [1]', 'varchar(200)'),
                           (@XML.value('(/GeocodeResponse/result/address_component[type="street_number"]/long_name) [1]', 'varchar(40)') + ' ' +
                            @XML.value('(/GeocodeResponse/result/address_component[type="route"]/long_name) [1]', 'varchar(40)')))
                            , 'Not Found in Google Maps')
                              
     SET @MapURL = 'https://maps.google.com/maps?f=q&hl=en&q=' + CAST(@GPSLatitude AS varchar(20)) + '+' + CAST(@GPSLongitude AS varchar(20))

 
     SELECT 
     @OrigAddress AS InputAddress,
     --@HTTPStatus,@ErrorMsg,
     @GPSLatitude AS GPSLatitude,
     @GPSLongitude AS GPSLongitude,
     @City AS City,
     @State AS [State],
     @PostalCode AS PostalCode,
     @Address AS [Address],
     @County AS County,
     @MapURL AS MapURL,
     @XML AS XMLResults
     
     END

END


GO
ALTER过程[dbo].[spAddressSearch]
--定义输入/输出变量
@地址varchar(80)=空输出,
@City varchar(40)=空输出,
@State varchar(40)=空输出,
@国家/地区varchar(40)=空输出,
@PostalCode varchar(20)=空输出,
@县varchar(40)=空输出,
@GPSLatitude数值(9,6)=空输出,
@GPSLongitude数值(9,6)=空输出,
@MapURL varchar(3000)=空输出
作为
开始
不计较
声明@OrigAddress VARCHAR(80);
设置@OrigAddress=@Address——为将来的输出创建一个单独的地址变量
--定义要查找的Google地理编码API URL
声明@URL varchar(3000)
设置@URL=https://maps.google.com/maps/api/geocode/xml?&address=' +
如果@Address不为空,则@Address ELSE“”结束+
当@City不为空时,“+@City ELSE”结束+
当@State不为NULL时,“+@State ELSE”结束+
当@PostalCode不为空时,“+@PostalCode ELSE”结束+
如果@Country不为NULL,则“+@Country ELSE”结束+
“&key=MY_API_key”-此密钥必须首先在Google云平台上生成
设置@URL=REPLACE(@URL,,'+'))
--准备HTTP请求
声明@XML
声明@Obj int
声明@Result int
声明@HTTPStatus int
声明@ErrorMsg varchar(8000)
EXEC@Result=sp_OACreate'MSXML2.ServerXMLHttp',@Obj OUT
--创建临时表以保存返回的XML值。
--由于返回的多个存储的XML值的大小超过VARCHAR(8000),因此必须将其存储在表(或表变量)中。
如果对象ID('tempdb..#xml')不是空的DROP TABLE#xml
创建表#xml(XMLValue-xml)
--发送HTTP请求
开始尝试
EXEC@Result=sp_OAMethod@Obj,'open',NULL,'GET',@URL,'false'
EXEC@Result=sp_OAMethod@Obj,'setRequestHeader',NULL,'Content Type','application/x-www-form-urlencoded'
EXEC@Result=sp_OAMethod@Obj,send,NULL,'
EXEC@Result=sp_OAGetProperty@Obj,'status',@HTTPStatus OUT
--将值强制转换为先前创建的临时表
插入#xml(XMLValue)
EXEC@Result=sp_OAGetProperty@Obj,'responseXML.xml'--
结束尝试
开始捕获--查看是否存在错误请求
SET@ErrorMsg=ERROR\u MESSAGE()
端接
EXEC@Result=sp_OADestroy@Obj
--错误处理:将错误数据输出到同一个表
如果(@ErrorMsg不为NULL)或(@HTTPStatus 200)
开始
设置@GPSLatitude=999.999999
设置@GPSLongitude=999.999999
设置@City='错误:'+ISNULL(@ErrorMsg,'HTTP:'+CAST(@HTTPStatus为varchar(10)))
设置@State='错误:'+ISNULL(@ErrorMsg,'HTTP:'+CAST(@HTTPStatus为varchar(10)))
设置@PostalCode='Error:'+ISNULL(@ErrorMsg,'HTTP:'+CAST(@HTTPStatus为varchar(10)))
设置@Country='错误:'+ISNULL(@ErrorMsg,'HTTP:'+CAST(@HTTPStatus为varchar(10)))
设置@County='错误:'+ISNULL(@ErrorMsg,'HTTP:'+CAST(@HTTPStatus为varchar(10)))
设置@Address='错误:'+ISNULL(@ErrorMsg,'HTTP:'+CAST(@HTTPStatus为varchar(10)))
设置@MapURL='错误:'+ISNULL(@ErrorMsg,'HTTP:'+CAST(@HTTPStatus为varchar(10)))
SET@XML=(从#XML中选择XMLValue)
挑选
@原文地址,
@GPSLatitude作为GPSLatitude,
@GPSLongitude作为GPSLongitude,
@城市作为城市,
@国家作为[国家],
@PostalCode作为PostalCode,
@地址为[地址],
@县作为县,
@MapURL作为MapURL,
@XML作为XMLResults
在spGeocode:'+ISNULL(@ErrorMsg,'HTTP结果为:'+CAST(@HTTPStatus为varchar(10))中设置@ErrorMsg='Error
结束
--如果未引发错误且状态=200-表示请求已捕获正常
如果(@ErrorMsg为空)和(@HTTPStatus=200)
开始
声明@TempAddress VARCHAR(500)
SET@XML=(从#XML中选择XMLValue)
SET@GPSLatitude=ISNULL(@XML.value(“(/GeocodeResponse/result/geometry/location/lat)[1],“numeric(9,6)”),999.99999)
设置@GPSLongitude=ISNULL(
ALTER PROCEDURE [dbo].[spAddressSearch]
 --Define input/output variables
 @Address varchar(80) = NULL OUTPUT,
 @City varchar(40) = NULL OUTPUT,
 @State varchar(40) = NULL OUTPUT,
 @Country varchar(40) = NULL OUTPUT,
 @PostalCode varchar(20) = NULL OUTPUT,
 @County varchar(40) = NULL OUTPUT,
 @GPSLatitude numeric(9,6) = NULL OUTPUT,
 @GPSLongitude numeric(9,6) = NULL OUTPUT,
 @MapURL varchar(3000) = NULL OUTPUT

 AS
 BEGIN
 SET NOCOUNT ON

 DECLARE @OrigAddress VARCHAR(80);
 SET @OrigAddress = @Address -- Create a separate address variable to future output

 --Define Google Geocoding API URL to look up for
 DECLARE @URL varchar(3000)
 SET @URL = 'https://maps.google.com/maps/api/geocode/xml?&address=' +
            CASE WHEN @Address IS NOT NULL THEN @Address ELSE '' END +
            CASE WHEN @City IS NOT NULL THEN ', ' + @City ELSE '' END +
            CASE WHEN @State IS NOT NULL THEN ', ' + @State ELSE '' END +
            CASE WHEN @PostalCode IS NOT NULL THEN ', ' + @PostalCode ELSE '' END +
            CASE WHEN @Country IS NOT NULL THEN ', ' + @Country ELSE '' END +
            '&key=MY_API_KEY' --This key must be generated on Google Cloud Platform first
 SET @URL = REPLACE(@URL, ' ', '+')


 --Prepare for HTTP request 
 DECLARE @XML xml
 DECLARE @Obj int 
 DECLARE @Result int 
 DECLARE @HTTPStatus int 
 DECLARE @ErrorMsg varchar(8000)

 EXEC @Result = sp_OACreate 'MSXML2.ServerXMLHttp', @Obj OUT 

 --Create a temp table to hold XML values returned. 
 --Due to the size of XML values exceed VARCHAR(8000) for a number of stores returned, it must be stored in a table (or table variable).
 IF OBJECT_ID('tempdb..#xml') IS NOT NULL DROP TABLE #xml
 CREATE TABLE #xml ( XMLValue XML )

 --Send HTTP request
 BEGIN TRY
     EXEC @Result = sp_OAMethod @Obj, 'open', NULL, 'GET', @URL, 'false'
     EXEC @Result = sp_OAMethod @Obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
     EXEC @Result = sp_OAMethod @Obj, send, NULL, ''
     EXEC @Result = sp_OAGetProperty @Obj, 'status', @HTTPStatus OUT 
     -- Cast value to the temp table created earlier
     INSERT  #xml (XMLValue)
     EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml'--
 
  
 END TRY
 BEGIN CATCH --See if there is bad request
    SET @ErrorMsg = ERROR_MESSAGE()
 END CATCH
 EXEC @Result = sp_OADestroy @Obj

 --Error handling: output bad data to the same table
 IF (@ErrorMsg IS NOT NULL) OR (@HTTPStatus <> 200) 
 BEGIN

     SET @GPSLatitude = 999.999999
     SET @GPSLongitude = 999.999999
     SET @City = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @State = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @PostalCode = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @Country = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @County = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @Address = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @MapURL = 'Error: ' + ISNULL(@ErrorMsg, 'HTTP: ' + CAST(@HTTPStatus AS varchar(10)))
     SET @XML = (SELECT XMLValue FROM #XML)

     SELECT 
     @OrigAddress AS OriginalAddress,
     @GPSLatitude AS GPSLatitude,
     @GPSLongitude AS GPSLongitude,
     @City AS City,
     @State AS [State],
     @PostalCode AS PostalCode,
     @Address AS [Address],
     @County AS County,
     @MapURL AS MapURL,
     @XML AS XMLResults

     SET @ErrorMsg = 'Error in spGeocode: ' + ISNULL(@ErrorMsg, 'HTTP result is: ' + CAST(@HTTPStatus AS varchar(10)))

 END

 --If no error raised and status = 200- meaning the request is captured OK
 IF (@ErrorMsg IS NULL) AND (@HTTPStatus = 200) 
 BEGIN
     DECLARE @TempAddress VARCHAR(500)
     
     SET @XML = (SELECT XMLValue FROM #XML)
     SET @GPSLatitude = ISNULL(@XML.value('(/GeocodeResponse/result/geometry/location/lat) [1]', 'numeric(9,6)'),999.999999)
     SET @GPSLongitude = ISNULL(@XML.value('(/GeocodeResponse/result/geometry/location/lng) [1]', 'numeric(9,6)'),999.999999)
     SET @City = ISNULL(
                 ISNULL(
                 ISNULL(
                 ISNULL(
                 ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="locality"]/long_name) [1]', 'varchar(40)'), 
                        @XML.value('(/GeocodeResponse/result/address_component[type="sublocality"]/long_name) [1]', 'varchar(40)')),
                        @XML.value('(/GeocodeResponse/result/address_component[type="neighborhood"]/long_name) [1]', 'varchar(40)')),
                        @XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_3"]/short_name) [1]', 'varchar(40)')),
                        @XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_1"]/short_name) [1]', 'varchar(40)')),
                        'Not Found in Google Maps')
     SET @State = ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_1"]/short_name) [1]', 'varchar(40)'), 'Not Found in Google Maps') 
     SET @PostalCode = ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="postal_code"]/long_name) [1]', 'varchar(20)'), 'Not Found in Google Maps') 
     SET @Country = ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="country"]/short_name) [1]', 'varchar(40)'), 'Not Found in Google Maps') 
     SET @County = ISNULL(@XML.value('(/GeocodeResponse/result/address_component[type="administrative_area_level_2"]/short_name) [1]', 'varchar(40)'),'Not Found in Google Maps')
     
     SET @Address = ISNULL(ISNULL(
                           @XML.value('(/GeocodeResponse/result/formatted_address) [1]', 'varchar(200)'),
                           (@XML.value('(/GeocodeResponse/result/address_component[type="street_number"]/long_name) [1]', 'varchar(40)') + ' ' +
                            @XML.value('(/GeocodeResponse/result/address_component[type="route"]/long_name) [1]', 'varchar(40)')))
                            , 'Not Found in Google Maps')
                              
     SET @MapURL = 'https://maps.google.com/maps?f=q&hl=en&q=' + CAST(@GPSLatitude AS varchar(20)) + '+' + CAST(@GPSLongitude AS varchar(20))

 
     SELECT 
     @OrigAddress AS InputAddress,
     --@HTTPStatus,@ErrorMsg,
     @GPSLatitude AS GPSLatitude,
     @GPSLongitude AS GPSLongitude,
     @City AS City,
     @State AS [State],
     @PostalCode AS PostalCode,
     @Address AS [Address],
     @County AS County,
     @MapURL AS MapURL,
     @XML AS XMLResults
     
     END

END


GO