解析SQL语句中数据来源

主要是对字符串和数组的一些操作, 逻辑如下:

function parse(sqlStr){

// 清空form
var rows = grid.findRows(function (row) {
      return true;
   });
grid.removeRows(rows, true);

var sql = sqlStr.sender.value
// 转为全大写
var upCaseSql = sql.toUpperCase().trim();
// 判断是否为select语句
if(upCaseSql.indexOf('SELECT') != 0 
&& upCaseSql.indexOf('UPDATE') != 0 
&& upCaseSql.indexOf('DELETE') != 0
&& upCaseSql.indexOf('INSERT') != 0
){
return;
}
// 按照 FROM 和 JOIN 分割sql并合并数组
var sqlFromAttr = upCaseSql.split(' FROM ');
var sqlJoinAttrMerge = upCaseSql.split(' JOIN ');
sqlFromAttr.forEach(item=>{sqlJoinAttrMerge.push(item) })
// 去除两端空格
for (let i = 0; i < sqlJoinAttrMerge.length; i++) {
sqlJoinAttrMerge[i] = sqlJoinAttrMerge[i].trim();
}
// 若数组只分割出一个元素则不进行解析
if(sqlJoinAttrMerge.length < 2){
return;
}
// 删除第一个元素
sqlJoinAttrMerge.shift();

var parseResult = [];
for (var s of sqlJoinAttrMerge) {
// 获取第一个空格的位置若不存在则取length
let sqlLastBlank = s.indexOf(" ") == -1 ? s.length : s.indexOf(" ");
// 获取得到FROM或JOIN后的第一个串sql
    var result = s.substring(0, sqlLastBlank);
    // 排除select语句
    if (result.indexOf(".") !== -1 || (result.indexOf("SELECT") == -1 && result.indexOf("(") == -1)) {
parseResult.push(result);
}
}
    // 分割结果获取到 表 Schema 库
    parseResult.forEach(x => {
    var index = upCaseSql.indexOf(x);
    var originSql = sql.substring(index,index+x.length)
        var parseResultAttr = originSql.split(".");
        var data = {}
        if (parseResultAttr.length >= 3) {
            data.sourceTable = parseResultAttr[parseResultAttr.length - 1];
            data.sourceSchema = parseResultAttr[parseResultAttr.length - 2];
            data.sourceSystem = parseResultAttr[parseResultAttr.length - 3];
        }
        if (parseResultAttr.length == 2) {
            data.sourceTable = parseResultAttr[parseResultAttr.length - 1];
            data.sourceSchema = parseResultAttr[parseResultAttr.length - 2];
        }
        if (parseResultAttr.length == 1) {
            data.sourceTable = parseResultAttr[parseResultAttr.length - 1];
        }
        if (parseResultAttr.length == 0) {
            console.log("脚本{["+sql+"]}: 解析成功,但未得到任何结果。。。");
        }
        var sourceAttr = grid.getData();
        for (var attr of sourceAttr) {
        if(attr.sourceTable == data.sourceTable && attr.sourceSchema == data.sourceSchema 
        && attr.sourceSystem == data.sourceSystem){
        return;
        }
        }
        
        if(data.sourceTable != null && data.sourceTable != ""){
        grid.addRow(data);
        }
    });
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值