我们从API中获取了一些日志服务,这些服务在查询正在访问的数据库时遇到了一些问题。
说,查询是这样的:
Select Top 10 * From DataBase..Table
我想要实现的目标是获得数据库"或者" ..."之前的文字。在字符串上。
此外,有时查询会如下:
Select Top 10 * From DataBase.Schema.Table
是否可以获得"数据库"这两个案件的字符串?
这是我一直在尝试做的事情,但我在正则表达方面表现不佳。
([A-Z]+\.+?([A-Z])*(\.)+[A-Z])
但这匹配以下(方括号):
Select Top 10 * From [DataBase..T]able
感谢您的帮助!
编辑: 这是在C#中完成的,在将查询/请求发送到数据库之前,我们正在尝试记录此API方法处理的每个请求。
答案 0 :(得分:0)
正如在评论中提到的那样,由于您可能遇到的复杂性,以这种方式解析SQL是个坏主意。但如果这是你想要做的事情,那么下面的工作应该可行。它适用于select或delete语句,insert / update不起作用,因为它们具有不同的结构。
public string GetDbName(string sql)
{
var sqlLower = sql.ToLower();
var parts = sqlLower.Split(new string[] { "from " }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 2)
{
//something is wrong in sql;
//may be its not a select statement
return null;
}
var tableName = parts[1]
.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
.FirstOrDefault();
var posOfTableName = tableName.LastIndexOf('.');
var dbName = tableName.Substring(0, posOfTableName);
//We can return here, but it will return lower case db name parts
//We can also get the original value as well by looking into original parameter
var indexOfStart = sqlLower.IndexOf(dbName);
return sql.Substring(indexOfStart, dbName.Length);
}