3

我正在开发一个批量插入数据的应用程序,以减少我想使用表值参数的查询数量。

例子:

var sql = require('node-sqlserver');

var connectionString = 'Driver={SQL Server Native Client 11.0};server=tcp:serverName.database.windows.net,1433;UID=user@serverName;PWD=password;Database={databaseName};Encrypt=yes;Connection Timeout=30;';

sql.open(connectionString, function(err, conn) {
    if(err) {
        return console.error('could not connect to sql', err);
    }

    var tableValuedObject = ???;

    var query = 'usp_InsertSomeTable ?';

    conn.query(query, tableValuedObject, function(err, result) {
        if(err) {
            return console.error('error running insert', err);
        }
    });
});

其中 usp_InsertSomeTable定义为

CREATE PROCEDURE usp_InsertSomeTable
    @TVP SomeTableType READONLY
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO SomeTable (Data) SELECT Data FROM @TVP;
END

我将表值对象定义为

CREATE TYPE SomeTableType AS TABLE
(
     Data VARCHAR(50)
);

JavaScript 对象应该具有或尚未在Node-SqlServer项目中实现的结构?

编辑1:

使用var tableValuedObject = { Data: 'Hello World' };会产生错误:

node-sqlserver\lib\sql.js:3254: Uncaught Error: [msnodesql] Invalid parameter(s) passed to function query or queryRaw.

编辑2:

使用var tableValuedObject = [{ Data: 'Hello World'}];产生和错误:

error running query { [Error: IMNOD: [msnodesql] Parameter 1: Invalid parameter type] sqlstate: 'IMNOD', code: -1 }
4

3 回答 3

3

函数的参数query必须作为数组传递(参见此处的示例)。尝试这样称呼它,它应该可以工作:

sql.open(connectionString, function(err, conn) {
    if(err) {
        return console.error('could not connect to sql', err);
    }

    var tableValuedObject = { Data: 'Hello World' };

    var query = 'usp_InsertSomeTable ?';

    conn.query(query, [tableValuedObject], function(err, result) {
        if(err) {
            return console.error('error running insert', err);
        }
    });
});
于 2013-08-27T04:39:22.603 回答
0

从源码来看,目前只支持原生的sql server类型。

https://github.com/WindowsAzure/node-sqlserver/blob/2ac58c8dda77406f081db693c70f2986b29b6025/src/OdbcOperation.cpp

但是,您可以在一个查询调用中运行多个插入。

var query = "INSERT INTO dbo.test ([key], [value]) VALUES ('1', 'a');" +
"INSERT INTO dbo.test ([key], [value]) VALUES ('2', 'b');" +
"INSERT INTO dbo.test ([key], [value]) VALUES ('3', 'c');" +
"INSERT INTO dbo.test ([key], [value]) VALUES ('4', 'd');" +
"INSERT INTO dbo.test ([key], [value]) VALUES ('5', 'e');";

conn.query(query, function(err, result) {
        if(err) {
            return console.error('error running insert', err);
        }
    });

当然,您可能不想内联您的值,在这种情况下,您可以使用参数并将所有值作为数组发送。

于 2013-09-06T15:21:03.867 回答
0

如果您的 Node.js 应用程序在 Windows 上运行(例如在 Windows Azure 网站中),运行任何 SQL 命令的便捷方法是通过 Edge.js 在 Node.js 进程中使用 .NET Framework 中的 ADO.NET(http: //tjanczuk.github.io/edge )。Edge.js 允许您在进程内运行 .NET 和 Node.js。

还有 edge-sql,一个 Edge.js 扩展,它使用 ADO.NET 和 Edge(http://tomasz.janczuk.org/2013/06/access-sql-azure-from-向 Node.js 公开基本 CRUD 操作) nodejs-app.html)。虽然 edge-sql 的当前功能不允许您在这里完成所需的功能,但 edge-sql 本身的实现可能是您自己的一个很好的起点(https://github.com/tjanczuk/edge-sql)。如果您想增强其功能集,我也会对 edge-sql 做出贡献。

于 2013-09-12T22:04:26.673 回答