我已經得到了我創建每月報告。報告的創建包含兩個步驟:
- 從我們的服務中獲取XML並將其存儲在數據庫中;
- 解析XML並創建文件。
對於我創建在手動模式下報表的最後幾個月。現在我想自動化這些東西。 但這裏談到一個
問題:
第二步(解析XML和文件創建)運行就像一個魅力,但第一步我觀察怪異的行爲。
我得到了存儲過程,而獲得XML:
ALTER PROCEDURE [Structure].[GetXML]
@LastActDate date,
@CurActDate date
AS
BEGIN
SET NOCOUNT ON;
begining:
DECLARE @URI varchar(2000),
@methodName varchar(50),
@objectID int,
@hResult int,
@setTimeouts nvarchar(255),
@serv nvarchar(255) = 'http://example.com/docs/',
@result nvarchar(max) = ''
DECLARE @t TABLE(Resp nvarchar(max))
declare @timeStamp nvarchar(50) = convert(nvarchar(50),CURRENT_TIMESTAMP,127)
declare @CurDate date = dateadd(day,0,getdate())
--EXEC @hResult = sp_OACreate 'WinHttp.WinHttpRequest.5.1', @objectID OUT
EXEC @hResult = sp_OACreate 'MSXML2.XMLHTTP', @ObjectID OUT
SELECT @URI = @serv + '.newchange?ds='+CONVERT(nvarchar(10),@LastActDate,104)+'&df='+CONVERT(nvarchar(10),@CurActDate,104)+'&pardaily=1',
@methodName='GET',
@setTimeouts = 'setTimeouts(9000,90000,900000,9000000)'
EXEC @hResult = sp_OAMethod @objectID, 'open', null, @methodName, @URI, 'false'
EXEC @hResult = sp_OAMethod @objectID, @setTimeouts
EXEC @hResult = sp_OAMethod @objectID, 'send', null
INSERT INTO @t
EXEC sp_OAGetProperty @objectID, 'responseText'
SELECT top 1 @result = Resp
FROM @t
if @result is null
begin
delete from @t
exec sp_OAGetErrorInfo @objectID
exec sp_OADestroy @objectID
goto begining
end
else
begin
INSERT INTO Structure.MonthlyRow
SELECT @timeStamp, @result
end
END
當我運行該SP像
EXEC [Structure].[GetXML] '2016-06-01', '2016-07-01'
我有一排Structure.MonthlyRow
表正確timestamp
和response
(平均長度〜 70k符號)
這是表的創建腳本:
CREATE TABLE Structure.MonthlyRow(
[timestamp] nvarchar(50) NOT NULL,
[RowResp] nvarchar(max) NULL,
CONSTRAINT [PK_dDayly] PRIMARY KEY CLUSTERED ([timestamp] DESC))
如果我創建一個啓動此SP的作業,我在表格中得到一行結果,並且結果的長度爲512個符號!這是XML,看起來就像是從截斷向nvarchar(max)
的nvarchar(512)
一個適當的一部分,但我沒有變量或表列有512個長度所使用。
有什麼我想:
- 作爲用戶運行與我的作業步驟屬性帳戶;
- 按計劃或手動啓動作業;
- 在SP添加
WITH EXECUTE AS OWNER
; - 使用
WinHttp.WinHttpRequest.5.1
和MSXML2.XMLHTTP
嘗試。
問:
什麼可能會是一個問題?爲什麼我在手動運行SP時得到了正確的結果,並且在運行SP作爲工作步驟時只有512個響應符號?
注:
是的,我知道,正從網絡服務XML是更好地PHP,C#,甚至PowerShell的處理,如果我不能找到一個解決方案,我將用其中的一個。在您的SP的頂部或在工作中你的SP的EXEC
前
也許你可以試着用Network Monitor或Wiresha這樣的工具來檢查網絡上發生的事情RK?看看請求是否相同 –