[ad_1]
APIでjsonデータを取得するストアドプロシージャをSQLサーバーに作成しました。
この SP は手動で一度に正常に実行されます。 ただし、このspを常に呼び出すSQLエージェントジョブを作成しました。 このジョブは常に動作し、約 3 時間は正常に動作しますが、その後 API から null を返します。 なぜそのようなことが起こるのでしょうか? C# Windows サービスで同じ API を呼び出すと、そのような問題は発生しないため、API には問題はありません。
ストアプロシージャ(Get_Raw_Data)
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エージェントのジョブステップ
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 日間追跡しました。 大丈夫です。データは常に取得しています。
[ad_2]
コメント