2013-10-04 43 views
3

即時通訊使用SQL服務器呼叫到谷歌地圖API和獲取GPS位置的數據。它工作得很好,但最近該叫一聲我的存儲過程失敗,此錯誤SQL服務器 - 谷歌地圖API返回太多的數據

0x8004271F 
ODSOLE Extended Procedure 
The source data specified for this string or binary column or parameter is too long. 

看來,當谷歌返回位置數據的「船載」正在達到字符的限制。

這是林召喚出這麼遠:

-- Select dbo.fnGetAddressFromGPS('33.83528299,-118.28754585') 

-- -- GO 
Declare @GPS VarChar(50) 
Set @GPS = '34.55,-118.50' 
DECLARE @URL VarChar(4000) 
DECLARE @win int 
DECLARE @hr int 
DECLARE @text varchar(8000) 

Set @URL = 'http://maps.googleapis.com/maps/api/geocode/xml?latlng=' + @GPS + '&sensor=false' 


Set @URL = 'http://maps.googleapis.com/maps/api/geocode/xml?latlng=34.5566767,-118.50677688&sensor=false' 
Set @URL = 'http://maps.googleapis.com/maps/api/geocode/json? latlng=34.5566767,-118.50677688&sensor=false' 

EXEC @hr=sp_OACreate 'WinHttp.WinHttpRequest.5.1',@win OUT 
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 

EXEC @hr=sp_OAMethod @win, 'Open',NULL,'GET',@url,'false' 
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 

EXEC @hr=sp_OAMethod @win,'Send' 
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 

EXEC @hr=sp_OAGetProperty @win, 'ResponseText',@text OUTPUT 
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 

EXEC @hr=sp_OADestroy @win 
--IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 



Select @Text As 'GoogleResult' 
Return 



IF CHARINDEX('ZERO_RESULTS', @text) > 0 
Select 'No Address Found' 


Declare @i Int 
Declare @j Int 
Declare @Address VarChar(150) 

SELECT @i = CHARINDEX('<formatted_address>', @Text); 
SELECT @j = CHARINDEX('</formatted_address>', @Text); 

SELECT @i = CHARINDEX('"formatted_address" : "', @Text); 
Select @i 
Return 


If @[email protected]('<formatted_address>') <= 0 
Select @Address = 'N/A' 
Else 
Select @Address = SubString(@text, @i+Len('<formatted_address>'), @[email protected] Len('<formatted_address>')) 

--Select @Address 

Select @Address 

我想什麼做的是限制從谷歌只格式化的地址部分返回的數據這是我真正需要的,但我還沒有發現在文件的任何地方如何做這樣的事情。我能想到的唯一的另一件事是截斷結果數據,但我目前無法弄清楚。任何幫助將非常感激。

+1

varchar(max)是什麼? – ScottE

+0

這不會工作,因爲我不能從響應中獲取文本。 –

+0

@ScottE有一個好點。你可以用'DECLARE @text varchar(MAX)'來運行它嗎? –

回答

3

這裏有趣的部分被插入到一個表:

DECLARE @resTbl AS TABLE(結果NVARCHAR(MAX))

INSERT @resTbl EXEC @ HttpWinRequest = sp_OAGetProperty把@win, 'responseText的'

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE dbo.usp_http_get 
    /* 
sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 
*/ 
    @url VARCHAR(8000) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @win int, @HttpWinRequest int 

DECLARE @resTbl AS TABLE (result NVARCHAR(MAX)) 



EXEC @HttpWinRequest=sp_OACreate 'WinHttp.WinHttpRequest.5.1',@win OUT 

IF @HttpWinRequest <> 0 EXEC sp_OAGetErrorInfo @win 
EXEC @HttpWinRequest=sp_OAMethod @win, 'Open',NULL,'GET',@url,'false' 

IF @HttpWinRequest <> 0 EXEC sp_OAGetErrorInfo @win EXEC @HttpWinRequest=sp_OAMethod @win,'Send' 


IF @HttpWinRequest <> 0 EXEC sp_OAGetErrorInfo @win 

INSERT @resTbl EXEC @HttpWinRequest=sp_OAGetProperty @win, 'ResponseText' 

IF @HttpWinRequest <> 0 EXEC sp_OAGetErrorInfo @win 
EXEC @HttpWinRequest=sp_OADestroy @win 

IF @HttpWinRequest <> 0 EXEC sp_OAGetErrorInfo @win 

SELECT * FROM @resTbl 
END 
GO 

EXEC usp_http_get @url = 'http://www.yahoo.com' -- varchar(8000) 
相關問題