缩短循环的动态SQL查询

问题描述:

我有一个函数构建一个sql查询,然后将其插入到客户端的light sql中。缩短循环的动态SQL查询

我认为即时通讯使用许多for循环,我将如何使这个更短?

function insert(dataBase,table,row){ 
    var j = 0; 

    var sqlQueryArray = []; 

    sqlQueryArray[j++] = 'INSERT INTO '; 
    sqlQueryArray[j++] = table 
    sqlQueryArray[j++] = ' (' 

    for (var i = row.length - 2; i >= 0; i--){ 
     sqlQueryArray[j++] = row[i].id + ','; 
    }; 

    sqlQueryArray[j++] = row[(row.length - 1)].id + ''; 
    sqlQueryArray[j++] = ')' 
    var sqlQueryString = ' VALUES '; 

    for (var i = row.length - 2; i >= 0; i--){ 
     sqlQueryArray[j++] = '?, '; 
    }; 

    sqlQueryArray[j++] = '?'; 
    sqlQueryArray[j++] = ');' 

    for (var i = 0; i < sqlQueryArray.length; i++){ 
     sqlQueryString += sqlQueryArray[i]; 
    } 
    var rowArray = [] 
    for (var i = row.length - 1; i >= 0; i--){ 
     rowArray[i] = row[i].val; 
    }; 

    dataBase.openDatabase.transaction(
     function (transaction) { 
      transaction.executeSql(sqlQueryString, 
       rowArray, 
       dataBase.nullSQLHandler, dataBase.QueryError); 
     } 
    ); 
} 

假设,你可以做这样的事情:

var insertStatement = 
    'INSERT INTO ' + table + 
    ' (' + rows.map(function (row) { return row.id; }).join(', ') + ')' + 
    ' VALUES (' + rows.map(function() { return '?'; }).join(', ') + ')'; 

无论您应该是向左作为练习读者:)

编辑:我只是在注释中注意到另一个答案,您将它发送到服务器执行。你当然应该而不是这样做,因为用户可以轻松地提交他们自己的SQL并对数据库造成各种破坏。您不应该相信通过网络收到的任何数据。

当在应用程序中创建动态SQL时,事情就会被释放并且儿童被吃掉。

为了多种安全性和性能方面的原因(更不用说可读性/可维护性),您应该真正使用参数化的SP作为参数。

+0

您的权利我可能更多的查询建立到服务器。它会使sql更加异步。 – 2010-11-30 03:04:25

+0

噢...你正在发送查询到服务器执行? – harto 2010-11-30 03:08:28

+0

现在我在客户端做这件事,但服务器是一个node.js服务器。所以我可能只是发送(表,行)并获得一个值数组的字符串。 – 2010-11-30 03:10:48

首先,我认为你最好不要手动跟踪索引(j++)。使用sqlQueryArray.push()在sqlQueryArray的末尾插入元素。

然后,简化你的代码,你可以创建一个返回您的自定义SQL通过你row变量作为参数的函数,用您可以生成所有的?标记的INSERT INTO条款。您使用的是相对较新的浏览器