2

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

行 9、文字 9、入力の予期しない終了

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

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

どこが間違っているのか、本当にアイデアを探しているだけです。

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

  1. 手動で実行すると、手順は問題なく実行されます

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

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

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

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

問題を再現できないため、これはロングショットであることはわかっていますが、どこから答えを探し始めるべきかについて誰かが考えを与えることができれば、それは大歓迎です.

Edit1: ご協力ありがとうございます。頭をすっきりさせるために、問題から少し離れなければなりませんでした。今週に戻ります。

わかりました、ようやく問題の根本を突き止めたと思います。これは、Web サイトからデータを取得するために使用しているコードです。ウェブサイトから引き出されたデータを切り捨てています。SSMSで実行すると完全に実行されます。バッチ ファイルを使用して実行するとデータが 2048 文字に切り捨てられ、SS ジョブを使用して実行するとデータが 512 文字に切り捨てられます。

これらの値をランダムにすることはできません。どこかに設定があるはずなのですが、見つかりません。何か案は?

コードは次のとおりです。

DECLARE 

@url nvarchar(max),
@win integer,
@hr integer ,
@Date date,
@SearchDate nvarchar(50)

Delete from XMLParsing.dbo.TextData

Set @Date = GETDATE()

set @SearchDate = CAST(@Date as nvarchar(50))

set @SearchDate = REPLACE(@SearchDate,'-','')

Select @url = 'http://semorep.sem-o.com/DataCollection/DataSets.asmx/queryDatasetXML?DatasetName=SET_CAL&User=primplims@gmail.com&Password=testsemo&FromDate=20130103&ToDate=20130111&P1=Energy&P2=Statements&P3=Initial&P4=&P5='

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 XMLParsing.dbo.TextData(SEMO_Data)
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

3 に答える 3

6

特定

SET TEXTSIZE 200000 

SQL エージェント ジョブ ステップで。TEXTSIZESQL エージェントのデフォルトは です512

于 2014-01-06T13:25:43.180 に答える
1

ただの更新。これが正しく機能しなかった理由は、サイトから取得された XML が切り詰められていたためです。なぜこれが起こっているのか完全にはわかりませんでしたが、WinHttp.WinHttpRequest.5.1 の代わりにwgetを使用して、サイトからすべてのデータを取得し、データを解析できる Web ページに直接渡しました。

于 2013-05-09T14:38:21.287 に答える
0

置くだけ SET TEXTSIZE (with a great value)

残りは SQL エージェントが行います。

于 2015-09-11T11:24:10.330 に答える