Node.js SQL Server: вызов хранимых процедур с параметрами OUTPUT

В этом руководстве вы узнаете, как вызвать хранимую процедуру с параметром OUTPUT в SQL Server из приложения Node.js.

Это руководство начинается с того места, где закончилось руководство «Вызов хранимой процедуры в Node.js».

Мы создадим новую хранимую процедуру в базе данных BookStore и вызовем ее из приложения Node.js.

Создание новой хранимой процедуры

Шаг 1. Откройте SQL Server Management Studio(SSMS) и подключитесь к своему SQL Server.

Шаг 2. Создайте новую хранимую процедуру GetAuthorsByBirthYear, которая возвращает авторов, чьи годы рождения находятся в пределах начального и конечного годов. Хранимая процедура имеет выходной параметр, который хранит количество найденных авторов.

CREATE PROCEDURE GetAuthorsByBirthYear(
    @StartYear SMALLINT,
 @EndYear SMALLINT,
    @AuthorCount INT OUTPUT
) AS
BEGIN
    SELECT 
 AuthorID, FirstName, LastName, BirthDate
    FROM
        Authors
    WHERE
        YEAR(BirthDate) BETWEEN @StartYear AND @EndYear
    ORDER BY
 BirthDate DESC;
    SELECT @AuthorCount = @@ROWCOUNT;
END;

Шаг 3. Протестируйте хранимую процедуру, выполнив следующие операторы:

DECLARE @count INT;
EXEC GetAuthorsByBirthYear
 @StartYear = 1775,
 @EndYear = 1812,
 @AuthorCount = @count OUTPUT;
SELECT @count;

Выход:

AuthorID | FirstName | LastName | BirthDate
---------+-----------+----------+------------
3        | Jane      | Austen   | 1775-12-16
20       | Mary      | Shelley  | 1797-08-30
9        | Charles   | Dickens  | 1812-02-07
(3 rows)
(No column name) 
----------------
3

Вызов хранимой процедуры из Node.js

Шаг 1. Измените файл procedure.js в каталоге проекта.

Шаг 2. Определите функцию findAuthorsByBirthYears в файле procedure.js, которая вызывает хранимую процедуру GetAuthorsByBirthYear:

// ...
const findAuthorsByBirthYears = async(startYear, endYear) => {
  try {
    // Connect to the database
    const pool = await sql.connect(config);
    // Call the stored procedure GetAuthorsByBirthYear
    const result = await pool
      .request()
      .input('StartYear', sql.SmallInt, startYear)
      .input('EndYear', sql.SmallInt, endYear)
      .output('AuthorCount', sql.Int)
      .execute('GetAuthorsByBirthYear');
    // Return the result
    return result;
  } catch(err) {
    console.error(err);
  }
};
export { findAuthorsByBirthDates, findAuthorsByBirthYears };

Как это работает.

Сначала импортируйте объект SQL из пакета mssql и объект конфигурации из модуля config.js:

import sql from 'mssql';
import { config } from './config.js';

Пакет mssql предоставляет API для взаимодействия с SQL Server. Конфигурация — это объект, содержащий параметры базы данных для подключения.

Во-вторых, подключитесь к базе данных, используя предоставленный объект конфигурации:

const pool = await sql.connect(config);

Функция sql.connect() возвращает объект ConnectionPool, который позволяет выполнять запросы.

В-третьих, вызовите хранимую процедуру с помощью метода execute() объекта ConnectionPool:

const result = await pool
  .request()
  .input('StartYear', sql.SmallInt, startYear)
  .input('EndYear', sql.SmallInt, endYear)
  .output('AuthorCount', sql.Int)
  .execute('GetAuthorsByBirthYear');

В этом заявлении:

  • pool.request() создает новый экземпляр запроса, представляющий один запрос, который вы хотите выполнить к базе данных.
  • input() определяет входные параметры оператора, включая StartYear и EndYear.
  • output() определяет выходной параметр хранимой процедуры, которым является AuthorCount.
  • .execute('GetAuthorsByBirthYear') вызывает хранимую процедуру GetAuthorsByBirthYear с входными/выходными параметрами.

Шаг 3. Измените файл index.js, чтобы вызвать функцию findAuthorsByBirthYears:

import { findAuthorsByBirthYears } from './procedure.js';
const result = await findAuthorsByBirthYears(1775, 1812);
console.log(result.output);

Как это работает.

Сначала импортируйте функцию findAuthorsByBirthYears из модуля procedure.js:

import { findAuthorsByBirthYears } from './procedure.js';

Во-вторых, вызовите функцию findAuthorsByBirthYears, чтобы найти авторов, чей год рождения находится в диапазоне между 1775 и 1812:

const result = await findAuthorsByBirthYears(1775, 1812);

В-третьих, отобразите выходной параметр AuthorCount:

console.log(result.output);

Шаг 4. Откройте терминал и выполните следующую команду для выполнения файла index.js:

npm start

Если вы видите следующий вывод, это означает, что программа успешно вызвала хранимую процедуру:

{ AuthorCount: 3 }

Загрузите исходный код проекта

Загрузите исходный код проекта

Краткое содержание

  • Используйте метод output() объекта Request, чтобы получить значение параметра OUTPUT хранимой процедуры.
Мирослав С.

Автор статей, ИБ-специалист