【发布时间】:2020-10-12 18:03:35
【问题描述】:
我有这个地址 3926 Linden St, Bethlehem, PA 18020 使用 SQL Server 2016 中的 Google Geocode API 进行地理编码。这是一个有效的地址,我用来打开 HTTP 请求的 URL 是
https://maps.googleapis.com/maps/api/geocode/xml?address=3926+Linden+St,+Bethlehem,+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
在这个特定的地址上,当我运行 SP 时
EXEC spGeocode '3926 Linden St, Bethlehem, PA 18020'
Geocode API 没有通过上述 SP 提供响应,但是当我在浏览器中输入整个 URL 时,它显示了有效的 XML 响应。还有许多其他有效地址遇到了同样的问题。 SQL Server SP 显示 HTTP 请求 STATUS 200,但根本没有错误消息,并且响应为 NULL,我认为这意味着没有给出响应。
更新 - 此问题仅发生在 Google Geocodes API 返回超过 1 个结果段的地址中。在这种情况下,responseXML.xml 变为 NULL。
我想知道如何解决这个问题。
【问题讨论】:
-
返回什么错误响应(在 SQL Server 中)?
-
没有返回错误。状态 200。它根本没有响应
-
返回的有效负载中的任何内容(当您获得状态 200 时)?
-
不幸的是 HTTPStatus 是唯一返回 200 的。没有返回任何其他信息。
-
有没有responseText?
标签: sql-server xml google-maps http geocoding