web-dev-qa-db-ja.com

SQL Serverエージェントからではなく手動で実行するとSQL Serverストアドプロシージャが機能する

SSMSの実行コマンドを使用して正常に実行されるプロシージャがありますが、同じコマンドをジョブに配置すると、次のエラーが発生します。

9行目、9文字目、予期しない入力の終わり

このコードは、UTF-8エンコーディングの非常に長いXML文字列を受け取り、それを単一のnvarchar(max)セルに入れます。次に、この文字列を別のテーブルのXMLセルに挿入して、nodes関数を使用してXMLコードの個々の部分をクエリできるようにします。エンコードの違いにより、nvarcharセルにデータを直接配置できません。

文字列が非常に長いため、ここでは文字列を再現できません。

私はそれがどこで間違っているのかについて本当に考えを探しています。

これが私がこれまでに知っていることです:

  1. プロシージャは実行時に問題なく実行されます手動で

  2. 権限の問題を確認しましたが、問題はないようです。エージェントは自分のアカウントで実行され、データベースのシステム管理者です

  3. 問題が発生している場所を正確に特定するために、手順を別々の部分に分割しました。ここでも、手動で実行すると別のプロシージャが正常に実行されますが、SQL Serverエージェントを介して実行するとエラーが発生します。

  4. SQL Serverエージェントを介してクエリを個別に実行すると、若干異なるエラーが発生します。これは、それがエンコーディングの問題であると信じるようになります。ただし、WebページからXMLを取得しているため、Webページのエンコードを変更できません。

行1、文字38、エンコーディングを切り替えることができません

これは問題を再現できないので、これは長い道のりですが、誰かがどこで答えを探し始めるかについてアイデアを提供できれば、それは非常にありがたいです。

編集1:XMLを取得するためのコードは次のとおりです。

Select @url = 'http://....'

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 

INSERT #TextData(HTML)
EXEC @hr=sp_OAGetProperty @win,'ResponseText'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

EXEC @hr=sp_OADestroy @win 
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 
4
Jennifer Nolan

行1、文字38、エンコーディングを切り替えることができません

私はしばらくの間、これに遭遇しました。SQLサーバーは、ソース文字列型をutfコードと一致させることを望んでいます。

    SELECT CAST('<?xml version = "1.0" encoding = "utf-8"?><nobody> </nobody>' AS XML)
    GO
    SELECT CAST('<?xml version = "1.0" encoding = "utf-16"?><nobody> </nobody>' AS XML)
    GO
    SELECT CAST(N'<?xml version = "1.0" encoding = "utf-8"?><nobody> </nobody>' AS XML)
    GO
    SELECT CAST(N'<?xml version = "1.0" encoding = "utf-16"?><nobody> </nobody>' AS XML)
    GO

最初のクエリと4番目のクエリだけが結果を持っていることがわかります。これは、xmlで宣言されたutf-「ビット/文字」がsqlデータ型と一致する場所です。

9行目、9文字目、予期しない入力の終わり

私はこの問題を別の方向から実行します。

  1. 受け取ったxmlをプロシージャに出力させる
  2. サービスアカウントの権限の問題をチェックします(SQLサーバーとエージェントサービスの違い)
2
Matt