Как передать данные буфера в TVP из node.js на сервер sql в лямбде? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть лямбда-функция для сохранения нескольких записей на сервере SQL с помощью хранимой процедуры.Я передаю данные из лямбды в виде табличных параметров (TVP).

Я успешно могу отправить 2 столбца типа varchar в TVP, но мне нужно передать 3-й столбец, который содержит данные буфера документа, которыйбыть сохраненным в таблице сервера sql (тип столбца - Image).

Данные в documentList приведены ниже

 [ 'abc', 'SIGNED', <Buffer 25 50 44 46 ... > ]

Когда я запускаю код, я получаю сообщение об ошибке в консоли как «RequestError»: Данные для табличного параметра "@documents" не соответствуют типу таблицы параметра. Ошибка SQL Server: 8029, состояние: 2 "

let list = []
    for (let i = 0; i < documentList.length; i++) {
        list.push({
            "id": documentList[i].id,
            "status": documentList[i].status,
            "fileContent": documentList[i].fileContent
        });
    }
    if (list.length > 0) {
        var rowList = []; 
        for (var i = 0; i < list.length; i++) {
            var paramList = []
            Object.keys(list[i]).forEach(key => {
                paramList.push(list[i][key]);
            });
            rowList.push(paramList);
        }
        var table = {
            columns: [
                { name: "id", type: TYPES.VarChar, length: 200 },
                { name: "status", type: TYPES.VarChar, length: 50 },
                { name: "fileContent", type: TYPES.Image }
            ],
            rows: rowList
        };
        var request = new Request(spUpdateDocumentStatus,
            function (err) {
                if (err) {
                    console.log(err);
                }
               connection.close();
            });
        request.addParameter('documents', TYPES.TVP, table);
        connection.callProcedure(request);
    }

Данные в переменной" таблица "время выполнения - как показано ниже

{ columns:
   [ { name: 'id', type: [Object], length: 200 },
     { name: 'status', type: [Object], length: 50 },
     { name: 'fileContent', type: [Object] } ],
  rows:
   [ [ 'abc',
       'SIGNED',
       <Buffer 25 50 44 46 ... > ] ] }

Тип таблицы, созданной мной на сервере sql, указан ниже

CREATE TYPE [dbo].[TestDocuments] AS TABLE(
    [id] [varchar] (200),
    [status] [varchar] (50),
    [fileContent] [image]
)

Вызываемая хранимая процедура выглядит так:

CREATE PROCEDURE [dbo].[spUpdateDocumentStatus] @documents TestDocuments readonly
AS
BEGIN
    -- logic
END

Примечание. Если не использовать TVP, если я передам те же данные буфера, что и у меня выше, в качестве типа Image в хранимую процедуру (изменил SP для принятия типа данных Image), тогда код сработает.

1 Ответ

0 голосов
/ 11 октября 2018

Попробуйте varBinary (max) вместо Image, и все должно быть в порядке.

 var table = {
            columns: [
                { name: "id", type: TYPES.VarChar, length: 200 },
                { name: "status", type: TYPES.VarChar, length: 50 },
                { name: "fileContent", type: TYPES.VarBinary}
            ],
            rows: rowList
        };

и измените тип таблицы на

CREATE TYPE [dbo].[TestDocuments] AS TABLE(
    [id] [varchar] (200),
    [status] [varchar] (50),
    [fileContent] [varBinary](max)
)
...