如何从Node中将表值参数插入Sql Azure?

时间:2013-08-25 05:25:53

标签: sql node.js azure azure-sql-database azure-mobile-services

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

示例:

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 }

3 个答案:

答案 0 :(得分:2)

函数query的参数必须作为数组传递(参见示例here)。尝试这样调用它,它应该工作:

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);
        }
    });
});

答案 1 :(得分: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);
        }
    });

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

答案 2 :(得分: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-nodejs-app.html)向Node.js公开基本的CRUD操作。虽然edge-sql的当前功能不允许你在这里完成你需要的东西,但是edge-sql本身的实现可能是你自己(https://github.com/tjanczuk/edge-sql)的一个很好的起点。如果你想增强它的功能集,我也会对edge-sql做出贡献。