Sql server Google Geocode API在SQL Server中不返回响应,但在浏览器中返回有效地址的有效XML响应
我的地址是宾夕法尼亚州伯利恒林登街3926号,邮编18020,在SQL Server 2016中使用谷歌地理编码API进行地理编码。这是一个有效地址,我用来打开HTTP请求的URL是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
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