You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Node.js的mssql模块直接向SQL Server插入对象?

当然有!mssql模块虽然语法和mysql模块不一样,但同样支持安全、便捷的对象式插入,核心是用参数化查询来实现,既避免了SQL注入,又不用手动拼接繁琐的SQL语句。下面给你两种常用的实现方式:

方式一:明确指定列名的插入(推荐,更清晰)

这种方式适合你提前知道表结构的场景,代码可读性更高:

const sql = require('mssql');

// 数据库配置
const dbConfig = {
    user: 'your_username',
    password: 'your_password',
    server: 'cccc.net', // 你的SQL Server地址
    database: 'your_database_name',
    options: {
        encrypt: true // 如果是Azure SQL或者需要加密连接的话开启,根据实际情况调整
    }
};

// 封装插入函数
async function insertMessage(messageData) {
    try {
        // 建立数据库连接
        await sql.connect(dbConfig);
        
        // 创建请求对象
        const request = new sql.Request();
        
        // 把对象的每个属性绑定为SQL参数
        request.input('srcUserID', messageData.srcUserID);
        request.input('destUserID', messageData.destUserID);
        request.input('messageContent', messageData.messageContent);
        request.input('messageSendDate', messageData.messageSendDate);
        
        // 执行插入语句,用@前缀引用参数
        const result = await request.query(`
            INSERT INTO messages (srcUserID, destUserID, messageContent, messageSendDate)
            VALUES (@srcUserID, @destUserID, @messageContent, @messageSendDate)
        `);
        
        console.log(`插入成功,共影响 ${result.rowsAffected[0]} 行`);
    } catch (err) {
        console.error('插入操作失败:', err);
    } finally {
        // 无论成功失败,都关闭连接
        await sql.close();
    }
}

// 准备要插入的对象
const post = {
    srcUserID: userSrcID,
    destUserID: msg.userid,
    messageContent: msg.txt,
    messageSendDate: sendDate
};

// 调用插入函数
insertMessage(post);
方式二:动态生成SQL(适合通用插入场景)

如果你需要一个可以复用在不同表的通用插入函数,可以动态提取对象的键作为列名,自动绑定参数:

async function insertIntoTable(tableName, dataObj) {
    try {
        await sql.connect(dbConfig);
        
        const request = new sql.Request();
        
        // 提取对象的键作为列名,生成参数占位符
        const columns = Object.keys(dataObj).join(', ');
        const paramPlaceholders = Object.keys(dataObj).map(key => `@${key}`).join(', ');
        
        // 批量绑定参数
        Object.entries(dataObj).forEach(([key, value]) => {
            request.input(key, value);
        });
        
        // 执行动态生成的插入语句
        const result = await request.query(`
            INSERT INTO ${tableName} (${columns})
            VALUES (${paramPlaceholders})
        `);
        
        console.log(`插入到${tableName}成功,影响行数:${result.rowsAffected[0]}`);
    } catch (err) {
        console.error('通用插入失败:', err);
    } finally {
        await sql.close();
    }
}

// 使用通用函数插入messages表
insertIntoTable('messages', post);
注意事项
  • 确保你的对象的键名和数据库表的列名完全一致,否则会出现列不存在的错误。
  • 如果涉及特殊数据类型(比如日期、二进制、自定义类型),可以在request.input里显式指定类型,比如request.input('messageSendDate', sql.DateTime, sendDate),mssql提供了sql.Int、sql.VarChar等多种内置类型。
  • 这两种方式都是参数化查询,和mysql的SET ?一样,能有效防止SQL注入,安全性拉满。

内容的提问来源于stack exchange,提问作者Nick Div

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:48