Subject:
我每个月都会创建一份报告。报告的创建包括 2 个步骤:
- 从我们的服务获取 XML 并将其存储在数据库中;
- 解析 XML 并创建文件。
在过去的几个月里,我以手动模式创建了报告。现在我想自动化这些东西。
但这里来了一个
Problem:
第二步(解析 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
and 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)
to nvarchar(512)
,但我没有使用长度为 512 的变量或表列。
我尝试过什么:
-
以用户身份运行使用我在“作业步骤”属性中的帐户;
- 作业按计划或手动启动;
- Add
WITH EXECUTE AS OWNER
in SP;
- 尝试使用
WinHttp.WinHttpRequest.5.1
and MSXML2.XMLHTTP
.
问题:
可能有什么问题?为什么我在手动运行 SP 时得到正确的结果,而在将 SP 作为作业步骤运行时仅得到 512 个响应符号?
Note:
是的,我知道从 Web 服务获取 XML 可以通过 PHP、C# 甚至 PowerShell 更好地处理,如果我找不到解决方案,我将使用其中之一。