缩短循环动态SQL查询

时间:2010-11-30 02:53:58

标签: javascript sql

我有一个构建sql查询的函数,然后将其插入客户端light 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);
        }
    );
}

3 个答案:

答案 0 :(得分:1)

当在应用程序中创建动态SQL时,就会释放出一些东西并且吃掉了孩子。

出于多种安全性和性能原因(更不用说可读性/可维护性),您应该为这个实际使用参数化SP。

答案 1 :(得分:1)

假设您使用的是相对较新的浏览器,可以执行以下操作:

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

是否 是否是留给读者的练习:)

编辑:我刚刚在另一个答案的评论中注意到您要将此信息发送给服务器执行。你绝对应该这样做,因为用户可以轻松提交自己的SQL并对数据库造成各种破坏。您不应该信任通过网络收到的任何数据。

答案 2 :(得分:0)

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

然后,为了简化代码,您可以创建一个函数,该函数返回一个自定义SQL,将row变量作为参数传递,您可以使用INSERT INTO子句生成所有?子句1}}标记。