Nodejs mssql / msnodesqlv8 проблема с отправкой точки с запятой в запросе базы данных - PullRequest
0 голосов
/ 21 мая 2019

Попытка создать базовый API для взаимодействия с базой данных MSSQL v12 с помощью Nodejs. Мне удалось подключиться к базе данных с помощью пакета mssql / msnodesqlv8, но параметризованные запросы не выполняются со следующим:

код: 'EREQUEST', номер: 102, состояние: не определено, originalError: {Ошибка: [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] Неверный синтаксис рядом с ''. sqlstate: '42000', код: 102}, name: 'RequestError'} Отладка: внутренняя, реализация, ошибка

Я использовал SQL Server Profiler и увидел, что запрос поступает как таковой

exec sp_executesql N'declare @SecurityKey nvarchar (MAX); set @ SecurityKey = @ P1; exec database.getSecurityBySecurityId @SecurityKey; ', N' @ P1 nvarchar (20) ', N'XXXXXXXX'

и терпит неудачу. После некоторого исследования возникает проблема с точками с запятой после операторов объявления и установки, поскольку это не разрешено в TSQL (очень плохо знаком с MSSql, нужно будет прочитать). Удаление точек с запятой действительно решило проблему, когда я запустил запрос вручную.

Так что мой вопрос заключается в следующем ... есть ли способ заставить msnodesqlv8 работать с моей версией на | Mssql и если да, то как? Есть ли способ пропустить эти точки с запятой.

Если вы думаете, что есть лучший способ, я хотел бы услышать его, поскольку я новичок в Nodejs + MSSql.

Содержимое getSecurity.sql

exec database.getSecurityBySecurityId @SecurityKey

содержимое index.js

"use strict";

const utils = require("../utils");

const api = async ({ sql, getConnection }) => {
    const sqlQueries = await utils.loadSqlQueries("events");
    const getSecurity = async SecurityKey => {
        const cnx = await getConnection();
        const request = await cnx.request();
        request.input('SecurityKey', SecurityKey);
        return request.query(sqlQueries.getSecurity);
    };

    return {
        getSecurity
    };
};

module.exports = { api };

1 Ответ

0 голосов
/ 22 мая 2019

Мне удалось обойти эту проблему, отредактировав библиотеку.

В ./lib/msnodesqlv8.js вы можете найти место, где объединяет строку запроса

...}

    if (input.length) command = `declare ${input.join(',')} ${sets.join(';')};${command};`
    if (output.length) {
      command += `select ${output.join(',')};`
      handleOutput = true
    }

....

Редактирование этого позволит вам контролировать поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...