gpt4 book ai didi

sql-server - 通过作业运行 SP 时的响应数据截断

转载 作者:行者123 更新时间:2023-12-04 00:38:02 25 4
gpt4 key购买 nike

主题:

我每个月都会创建一份报告。报告的创建包括两个步骤:

  • 从我们的服务中获取一个 XML 并将其存储在 DB 中;
  • 解析 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 表中得到一行正确的 timestampresponse(平均长度为 ~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.1MSXML2.XMLHTTP

  • 问题:

    什么可能是一个问题?为什么当我手动运行我的 SP 时我得到了正确的结果,而在将 SP 作为作业步骤运行时只有 512 个响应符号?

    注意:

    是的,我知道从 Web 服务获取 XML 最好由 PHP、C# 甚至 PowerShell 处理,如果我找不到解决方案,我将使用其中之一。

    最佳答案

    在 sp 的顶部或作业中的 EXEC 之前添加此行

    SET TEXTSIZE 2147483647;

    问题是工作设置了默认值
    SET TEXTSIZE 1024

    这将返回的数据限制为 1024 个字符( n 字符为 512 个)

    关于sql-server - 通过作业运行 SP 时的响应数据截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38739799/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com