Как создать параметр таблицы и передать его в хранимую процедуру в Prisma

Вопрос или проблема

Я работаю над переводом устаревшей кодовой базы на стек 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. Вот пример кода, который демонстрирует это:

  1. Установите необходимые пакеты:
npm install mssql prisma
  1. Создайте подключение к базе данных и передайте таблицу значений:
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.

Оцените материал
Добавить комментарий

Капча загружается...