我有一个存储过程,该存储过程调用Web服务并获取响应。最初,我对大于4000个字符的响应有问题,但后来在论坛上发现了将数据插入到临时表中的技巧。直到我将我的SP合并到通过服务代理调用该SP的数据库触发器中,此方法才能正常工作。 SP开始失败,并显示XML没有结构化的错误,然后我将响应存储到文本值中(作为日志),然后我发现实际上响应被再次限制为少于4000个字符。奇怪的是,为什么当我手动调用相同的SP时它可以正常工作,而通过服务代理调用它却不能正常工作。以下是SP中包含我正在描述的过程的部分。
declare @obj int
,@responseXml xml
,@status nvarchar(50)
,@statusText nvarchar(1024)
,@method nvarchar(10) = (case when @HttpMethod in ('soap','SOAP') then 'POST' else @HttpMethod end)
exec sp_OACreate 'MSXML2.ServerXMLHttp', @obj out
exec sp_OAMethod @obj, 'Open', null, @method, @Url, false
declare @host nvarchar(1024) = @Url
if @host like 'http://%'
set @host = right(@host, len(@host) - 7)
else if @host like 'https://%'
set @host = right(@host, len(@host) - 8)
if charindex(':', @host) > 0 and charindex(':', @host) < charindex('/', @host)
set @host = left(@host, charindex(':', @host) - 1)
else
set @host = left(@host, charindex('/', @host) - 1)
declare @envelope nvarchar(max) = cast('' as nvarchar(max)) + '<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mob="http://mobility.sce.webservices.infor.com/"><soapenv:Header/><soapenv:Body><mob:{action}><String_1 xmlns="">{params}</String_1></mob:{action}></soapenv:Body></soapenv:Envelope>'
declare @params nvarchar(max) = cast('' as nvarchar(max))
set @envelope = replace(@envelope, '{action}', @SoapAction)
set @envelope = replace(@envelope, '{params}', @ParamsValues)
set @SoapAction = @SoapAction
exec sp_OAMethod @obj, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
exec sp_OAMethod @obj, 'setRequestHeader', null, 'Host', @host
exec sp_OAMethod @obj, 'send', null, @envelope
DECLARE @responseText as table(responseText xml)
exec sp_OAMethod @obj, 'responseXml', @responseXml OUTPUT
INSERT INTO @ResponseText (ResponseText) EXEC sp_OAGetProperty @Obj, 'responseText'
exec sp_OADestroy @obj
非常感谢您的帮助,因为我感到沮丧,无法为此找到解决方案。
预先感谢,请不要告诉我使用CLR