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

我正在研究一个批量插入数据的应用程序,以减less我想要使用Table Valued参数的查询数量。

例:

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 } 

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

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

函数query的参数必须以数组forms传递(请参阅此处的示例)。 尝试调用它,它应该工作:

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

从源代码来看,它目前只支持原生的sql servertypes。

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

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