Вопрос или проблема
Я работаю над переводом устаревшей кодовой базы на стек Node JS. Многие компоненты приложения зависят от хранимых процедур. У меня есть массив данных под названием entryData
, который мне нужно вставить с использованием хранимой процедуры.
Хранимая процедура выглядит следующим образом,
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[entries]
@input_target dbo.master_input READONLY
AS
INSERT INTO dbo.master (
id,
code,
email,
first_name,
last_name,
additional_information,
date_added)
SELECT
input.id,
input.code,
input.email,
input.first_name,
input.last_name,
input.additional_information,
input.date_added
FROM @input_target input;
GO
input_target
является параметром табличного типа, заполняемым массивом данных entryData
.
Ответ или решение
Для выполнения задачи передачи параметров таблицы (table-valued parameters, TVP) в хранимую процедуру с использованием Prisma и Node.js, вам потребуется выполнить несколько шагов. Вот полное руководство, как это можно сделать.
Шаг 1: Определение типа таблицы в SQL Server
Ваша хранимая процедура использует тип таблицы dbo.master_input
. Убедитесь, что этот тип таблицы создан в вашей базе данных. Если он еще не создан, вы можете его создать следующим образом:
CREATE TYPE dbo.master_input AS TABLE (
id INT,
code NVARCHAR(50),
email NVARCHAR(100),
first_name NVARCHAR(50),
last_name NVARCHAR(50),
additional_information NVARCHAR(MAX),
date_added DATETIME
)
Шаг 2: Настройка Prisma для работы с TVP
К сожалению, Prisma не поддерживает напрямую таблицы значений в своем API. Однако вы можете использовать пакет mssql
для работы с SQL Server, что позволяет передавать TVP. Вот пример кода, который демонстрирует это:
- Установите необходимые пакеты:
npm install mssql prisma
- Создайте подключение к базе данных и передайте таблицу значений:
const sql = require('mssql');
async function insertEntries(entryData) {
try {
// Конфигурация подключения к базе данных
const pool = await sql.connect({
user: 'YOUR_USERNAME',
password: 'YOUR_PASSWORD',
server: 'YOUR_SERVER',
database: 'YOUR_DATABASE',
options: {
encrypt: true, // Включите, если используете Azure
trustServerCertificate: true // Для локального тестирования
}
});
// Создание типа таблицы
const table = new sql.Table('master_input');
table.create = false; // Укажите, что тип таблицы уже существует
table.columns.add('id', sql.Int);
table.columns.add('code', sql.NVarChar(50));
table.columns.add('email', sql.NVarChar(100));
table.columns.add('first_name', sql.NVarChar(50));
table.columns.add('last_name', sql.NVarChar(50));
table.columns.add('additional_information', sql.NVarChar(sql.MAX));
table.columns.add('date_added', sql.DateTime);
// Наполнение таблицы значениями
entryData.forEach(entry => {
table.rows.add(
entry.id,
entry.code,
entry.email,
entry.first_name,
entry.last_name,
entry.additional_information,
entry.date_added
);
});
// Вызов хранимой процедуры
await pool.request()
.input('input_target', table)
.execute('entries');
console.log('Данные успешно вставлены');
} catch (err) {
console.error('Ошибка при вставке данных:', err);
} finally {
// Закрытие соединения
await sql.close();
}
}
// Пример использования
const entryData = [
{
id: 1,
code: 'CODE1',
email: 'test1@example.com',
first_name: 'Иван',
last_name: 'Иванов',
additional_information: 'Информация 1',
date_added: new Date()
},
// Добавьте другие записи по необходимости
];
insertEntries(entryData);
Шаг 3: Тестирование
Запустите код Node.js, чтобы убедиться, что данные успешно передаются в хранимую процедуру. Проверьте вашу таблицу master
, чтобы увидеть, были ли записи успешно добавлены.
Итог
С помощью вышеописанных шагов вы сможете создать параметр таблицы в SQL Server, передать его в хранимую процедуру и правильно завершить выполнение вставки данных из массива entryData
. Это позволит вам интегрировать ваши существующие хранимые процедуры в новую кодовую базу на Node.js.