T- SQL - Расширенная процедура ODSOLE Исходные данные, указанные для этой строки или двоичного столбца или параметра, слишком длинные - PullRequest
0 голосов
/ 04 августа 2020

Моя цель - подключиться к webapi и запросить данные.

Я совершенно уверен, что я подключен и получаю данные обратно, потому что сообщение об ошибке указывало на то, что данных для хранения слишком много. Если мой @url + @respondsbody установлен правильно, я не должен получить более 2500 символов.

Ошибка: скриншот сообщения об ошибке

Кто-нибудь понимает, почему у меня не получается?

    DECLARE 
    @object int,
    @hr int,
    @src varchar(8000),
    @desc varchar(8000),
    @authHeader NVARCHAR(4000),
    @contentType NVARCHAR(4000),
    @postData NVARCHAR(2000),
    @responseText NVARCHAR(4000),
    @responseXML NVARCHAR(4000),
    @ret INT,
    @status NVARCHAR(4000),
    @statusText NVARCHAR(4000),
    @token INT,
    @methodName varchar(50) = 'GET',
    @requestBody varchar(8000) = '$select=*&limit=1',
    @UserName nvarchar(100) = 'dummy',
    @Password nvarchar(100) = 'dummy' 
DECLARE 
    @url NVARCHAR(4000) = 'https://restapi.dummy.com/prod/rest/api/v1/01/products';
DECLARE
    @json AS TABLE(Json_Table NVARCHAR(4000));



SET NOCOUNT ON
IF    @methodName = ''
    BEGIN
        select FailPoint = 'Method Name must be set'
        return
    END

-- Set Authentications
SET @authHeader = 'BASIC 123456789';
SET @contentType = 'application/json';

-- Open a connection
EXEC @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @token OUT;
    IF @ret <> 0 
        BEGIN  
            EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT   
            RAISERROR('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc)  
            RETURN  
        END;  

-- make a request
EXEC @ret = sp_OAMethod @token, 'open', NULL, @methodName, @url, 'false', @UserName, @Password;
    IF @ret <> 0 
        BEGIN
            EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
            SELECT      hResult = convert(varbinary(4), @ret), 
                source = @src,
                description = @desc,
                FailPoint = 'Open failed',
                MethodName = @methodName 
            goto destroy 
            return
        END

EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Authentication', @authHeader;
    IF @ret <> 0 
        BEGIN
            EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
            SELECT      hResult = convert(varbinary(4), @ret), 
                source = @src,
                description = @desc,
                FailPoint = 'SetRequestHeader failed: Authentication',
                MethodName = @methodName 
            goto destroy 
            return
        END

EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Content-type', @contentType;
    IF @ret <> 0 
        BEGIN
            EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
            SELECT      hResult = convert(varbinary(4), @ret), 
                source = @src,
                description = @desc,
                FailPoint = 'SetRequestHeader failed: Content-type',
                MethodName = @methodName 
            goto destroy 
            return
        END

DECLARE
    @len int
    SET @len = len(@requestBody);

EXEC @ret = sp_OAMethod @token, 'setRequestHeader', null, 'Content-Length', @len;
IF @ret <> 0 
        BEGIN
            EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
            SELECT      hResult = convert(varbinary(4), @ret), 
                source = @src,
                description = @desc,
                FailPoint = 'SetRequestHeader failed: Content-Length',
                MethodName = @methodName 
            goto destroy 
            return
        END

EXEC @ret = sp_OAMethod @token, 'send', null, @requestBody
    IF @ret <> 0 
        BEGIN
            EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
            SELECT      hResult = convert(varbinary(4), @ret), 
                source = @src,
                description = @desc,
                FailPoint = 'Send failed',
                MethodName = @methodName 
            goto destroy 
            return
        END

-- Handle responce
EXEC @ret = sp_OAGetProperty @token, 'status', @status OUT;
EXEC @ret = sp_OAGetProperty @token, 'statusText', @statusText OUT;
EXEC @ret = sp_OAGetProperty @token, 'responseText', @responseText OUT;
    IF @ret <> 0 
        BEGIN
            EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
            SELECT      hResult = convert(varbinary(4), @ret), 
                source = @src,
                description = @desc,
                FailPoint = 'ResponseText failed',
                MethodName = @methodName 
            goto destroy 
            return
        END

-- Print response
--PRINT 'Status: ' + @status + ' (' + @statusText + ')';
--PRINT 'Response text: ' + @responseText;

-- Grab the responseText property, and insert the JSON string into a table temporarily. This is very important, if you don't do this step you'll run into problems.
INSERT into @json (Json_Table) EXEC sp_OAGetProperty @token, 'responseText'
--Select the JSON string from the Table we just inserted it into. You'll also be able to see the entire string with this statement.
SELECT * FROM @json

DESTROY: 

EXEC sp_OADestroy @token 

SET NOCOUNT OFF

1 Ответ

0 голосов
/ 13 августа 2020

Первым шагом было изменение переменной типа данных с 4000 на max.

Последним ударом было закомментировать следующий оператор IF. Может быть, кто-нибудь объяснит мне, почему это утверждение не работает должным образом.

EXEC @ret = sp_OAGetProperty @token, 'responseText', @responseText OUT;
--IF @ret <> 0 
    --BEGIN
    --    EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
    --    SELECT      hResult = convert(varbinary(4), @ret), 
    --        source = @src,
    --        description = @desc,
    --        FailPoint = 'ResponseText failed',
    --        MethodName = @methodName 
    --    goto destroy 
    --    return
    --END
...