【问题标题】:How to insert table valued parameters into Sql Azure from Node?如何将表值参数从 Node 插入 Sql Azure?
【发布时间】:2013-08-25 05:25:52
【问题描述】:

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

例子:

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

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

编辑 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 }

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 好吧,我试过了,它返回:error running query { [Error: IMNOD: [msnodesql] Parameter 1: Invalid parameter type] sqlstate: 'IMNOD', code: -1 }
    【解决方案2】:

    如果您的 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 做出贡献。

    【讨论】:

    • 你没有回答这个问题。
    【解决方案3】:

    从源码来看,目前只支持原生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);
            }
        });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多