缩短循环的动态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作为参数。
答
首先,我认为你最好不要手动跟踪索引(j++
)。使用sqlQueryArray.push()在sqlQueryArray
的末尾插入元素。
然后,简化你的代码,你可以创建一个返回您的自定义SQL通过你row
变量作为参数的函数,用您可以生成所有的?
标记的INSERT INTO
条款。您使用的是相对较新的浏览器
您的权利我可能更多的查询建立到服务器。它会使sql更加异步。 – 2010-11-30 03:04:25
噢...你正在发送查询到服务器执行? – harto 2010-11-30 03:08:28
现在我在客户端做这件事,但服务器是一个node.js服务器。所以我可能只是发送(表,行)并获得一个值数组的字符串。 – 2010-11-30 03:10:48