如何从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。
但是,您可以在一个查询调用中运行多个插入。
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); } });
当然,你可能不想内联你的值,在这种情况下,你可以使用参数并将所有的值作为一个数组发送。