【解決方法】t-SQL の API によって null 応答テキストが返されるのはなぜですか?

プログラミングQA


APIでjsonデータを取得するストアドプロシージャをSQLサーバーに作成しました。
この SP は手動で一度に正常に実行されます。 ただし、このspを常に呼び出すSQLエージェントジョブを作成しました。 このジョブは常に動作し、約 3 時間は正常に動作しますが、その後 API から null を返します。 なぜそのようなことが起こるのでしょうか? C# Windows サービスで同じ API を呼び出すと、そのような問題は発生しないため、API には問題はありません。

ストアプロシージャ(Get_Raw_Data)

SQL
DECLARE @ResponseText as nvarchar(max),@Token VARCHAR(100),@URL VARCHAR(100)

SET @Token='mytoken'
SET @URL ='myURL'

DECLARE @responseTextTable table(responseText varchar(max));

Declare @Object as Int;
--Declare @ResponseText as Varchar(max);
Declare @Body as varchar(max);

Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;
EXEC  sp_OAMethod @Object, 'open', NULL, 'get',@URL, 'false'

Exec sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'
Exec sp_OAMethod @Object, 'setRequestHeader', null, 'Authorization', @Token
Exec sp_OAMethod @Object, 'send', null, @body

insert into @responseTextTable (responseText)
Exec sp_OAMethod @Object, 'responseText'

select @ResponseText = responseText from @responseTextTable

IF ISJSON(@ResponseText)=1 BEGIN
    SELECT device_id, company_id, master_name, last_at,status,date,timestamp,tag.[key],tag.[value],tag.[type],JSON_VALUE(tag.[value],'$.name') tagName,JSON_VALUE(tag.[value],'$.value') AS tagValue
    FROM OPENJSON(@ResponseText)
    WITH (
            device_id NVARCHAR(max) '$.device_id',
            company_id NVARCHAR(max),
            master_name NVARCHAR(50)'$.name',
            last_at DATETIME2 '$.last_at',
            status NVARCHAR(max),
            date DATETIME2 '$.date',
            timestamp NVARCHAR(max),
            tags NVARCHAR(MAX) '$.tags' AS JSON
        )
    OUTER APPLY OPENJSON(tags) tag
END

SQLエージェントのジョブステップ

SQL
SET TEXTSIZE 2147483647
WHILE 1=1 BEGIN
	Exec Get_Raw_Data
	WAITFOR DELAY '00:00:45';
END

助けてください、なぜこれが起こっているのですか?
ありがとう、

私が試したこと:

varchar(max) を varchar(800) に変更しました。

解決策 2

理由が見つかったといいのですが。 最後の手順の後に「exec sp_OADestroy @Object」を追加しました。 20時間稼働しましたが問題ありません。

解決策 3

@Object を Int として宣言します。
@ResponseText を Varchar(800) として宣言します。

sp_OACreate ‘MSXML2.ServerXMLHTTP’, @Object OUT; を実行します。
sp_OAMethod を実行 @Object, ‘open’, NULL, ‘get’,
‘@url’,
‘間違い’
sp_OAMethod @Object を実行、’send’
sp_OAMethod @Object, ‘responseText’, @ResponseText 出力を実行します

@ResponseText を選択します
sp_OADestroy @Object を実行

解決策 1

Windows サービスの実行を 2 日間追跡しました。 大丈夫です。データは常に取得しています。

コメント

タイトルとURLをコピーしました