2016-08-21 4 views
1

私は最初の手順を使用しようとしています。私はGoogleマトリックスのためにそれが必要です。これは私の手順で、XML解析エラーによる処理結果

CREATE PROCEDURE [dbo].[CalculateDistanceGoogle] 
    (@ToAddress NVARCHAR(100), 
    @FromAddress NVARCHAR(100), 
    @DistanceistanceInKm FLOAT OUTPUT) 
AS 
BEGIN 
    DECLARE @Object INT 
    DECLARE @ResponseonseText NVARCHAR(4000) 
    DECLARE @StatuserviceUrl NVARCHAR(500) 

    SET @StatuserviceUrl = 'http://maps.googleapis.com/maps/api/distancematrix/xml?origins=' + @ToAddress + '&destinations=' + @FromAddress +'&mode=driving&language=it-IT&units=metric;' 

    EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT; EXEC sp_OAMethod @Object, 'open', NULL, 'get', @StatuserviceUrl, 'false' EXEC sp_OAMethod @Object, 'send' EXEC sp_OAMethod @Object, 'responseText', @ResponseonseText OUTPUT 

    DECLARE @Response XML 

    SET @Response = CAST(CAST(@ResponseonseText AS NVARCHAR(MAX)) AS XML) 

    DECLARE @Status NVARCHAR(20) DECLARE @Distance NVARCHAR(20) 

    SET @Status = @Response.value('(DistanceMatrixResponse/row/element/status)[1]', 'NVARCHAR(20)') 

    IF(@Status = 'ZERO_RESULTS') 
     SET @Distance = NULL 
    ELSE 
     SET @Distance = @Response.value('(DistanceMatrixResponse/row/element/distance/value)[1]', 'NVARCHAR(20)') 

    SET @DistanceistanceInKm = ROUND(CAST(@Distance AS FLOAT)/1000, 1) 

    PRINT @DistanceistanceInKm 
END 

が発見し、これを変数に距離の結果を格納するための実行です:

Msg 9402, Level 16, State 1, Procedure CalculateDistanceGoogle, Line 13
XML parsing: line 1, character 38, unable to switch the encoding

はあなたが助けることができる:

DECLARE @Distanza NVARCHAR 
EXEC @Distanza = dbo.CalculateDistanceGoogle @ToAddress = 'CITY', @FromAddress='CITY', @DistanceistanceInKm = @Distanza 
PRINT @Distanza 

私はこのエラーを取得しますなぜ私は理解する?

ありがとうございました!

答えて

0

主な問題は、GoogleがUTF-8およびSQL ServerなどのエンコードされたXMLを返しているということです両方XMLNVARCHAR/NCHARデータのための唯一のハンドルや店舗UTF-16(リトルエンディアン)。

私は、次のURLを使用:

http://maps.googleapis.com/maps/api/distancematrix/xml?origins=Boise+ID&destinations=Casper+WY&mode=driving&language=en-US 

をし、次の応答受信:だから

<?xml version="1.0" encoding="UTF-8"?> 
<DistanceMatrixResponse> 
<status>OK</status> 
<origin_address>Boise, ID, USA</origin_address> 
<destination_address>Casper, WY, USA</destination_address> 
<row> 
    <element> 
    <status>OK</status> 
    <duration> 
    <value>36626</value> 
    <text>10 hours 10 mins</text> 
    </duration> 
    <distance> 
    <value>1103852</value> 
    <text>1,104 km</text> 
    </distance> 
    </element> 
</row> 
</DistanceMatrixResponse> 

を、非常に単純な意味では、あなたは、単にencoding="UTF-8"文字列を削除することによって、これを「修正する」ことができXML文書から変換してXMLに変換します。あなただけのSET @Response = CAST(...線の上に次の行を追加することでこれを行うことができます。

SET @ResponseonseText = REPLACE(@ResponseonseText, N'encoding="UTF-8"', N''); 

ちょうどマングルされ得るかもしれない特定の文字がUTF-8 として通じてくることを心に留めておくときNVARCHAR変数に格納。しかしおそらくその部分はすでにsp_OAMethodによって世話を受けています。その場合、あなたはそれについて心配する必要はありません。

また:

  • Google API docsによると、あなたは、API "キー" パラメータを渡すことになっています。しかし、どういうわけか、それは少なくとも限定された意味で、それがなければ働いているように見えます。
  • sp_OA* OLEオートメーションの手順は、SQL Server 2005が導入された時点で廃止されたので、廃止することを検討する必要があります。このような機能をSQLCLRに移行することが優先されます。 (もちろん、まだSQL Server 2005を使用している場合は、これもしばらくの間非難されていました;-)
  • ストアドプロシージャが終了するとOLEオブジェクトを自動的にクリーンアップする必要がありますが、アイデアはのための行を追加します。それは無用であるとして、あなたは@ResponseonseTextためNVARCHAR(MAX)CASTを削除する必要があり
  • NVARCHAR(MAX)としてsp_OADestroy@Object
  • @ResponseonseTextを宣言する必要があります。その変数をNVARCHAR(4000)としなければならない場合でも、CASTMAXは実際に何もしません。
  • BEGINの直後に、ストアドプロシージャの上部にSET NOCOUNT ON;を追加します。
  • TRY...CATCH構造でこれを囲む必要があります。
+0

- 私はUTF 8行の置換えを追加していますが、今はエラーにはなりませんが、印刷結果は0です。まだ間違っていますか? - どのようにsp_OAをSQLCLRに置き換える必要がありますか?私はそれを直接置き換えると、作成されていないテーブルに対してエラーが表示されます。 – BigBlack

+0

- キャストを削除しました - ノーカウントを設定しました - 試してキャッチする理由を理解できません。 – BigBlack

関連する問題