【发布时间】:2017-02-14 11:47:13
【问题描述】:
我们有一些来自 API 的日志服务在捕获查询正在访问的数据库时遇到了一些问题。
比如说,一个查询是这样的:
Select Top 10 * From DataBase..Table
我想要实现的是在字符串上获取“DataBase”或“..”之前的文本。
另外,有时查询是这样的:
Select Top 10 * From DataBase.Schema.Table
是否有可能在这两种情况下都获得“DataBase”字符串?
这是我一直在尝试做的,但我在正则表达式方面做得不是很好。
([A-Z]+\.+?([A-Z])*(\.)+[A-Z])
但这匹配以下内容(在方括号中):
Select Top 10 * From [DataBase..T]able
感谢您的帮助!
编辑: 这是在 C# 中完成的,在将查询/请求发送到数据库之前,我们会尝试记录此 API 方法处理的每个请求。
【问题讨论】:
-
SQL 是一门复杂的语言,尝试使用像正则表达式这样的直接字符串方法来解析它可能会有风险,最值得信赖的方法是使用 SQL 解析器。对于您的具体示例的具体问题,我建议使用关键字“From”来启动您的模式并(在捕获组中)在任意数量的空格之后抓取所有不是点的内容。
-
这是在 c# 中完成的。这是一个在查询数据库之前捕获请求并登录到文件中的 API。它没有在 SQL Server 中完成,如果我不清楚,请见谅。
-
数据库名称可以包含任何字符,包括点。一种更通用和幼稚的方法是查找“from”和“.”之间的子字符串,但请注意,数据库甚至可以命名为
[ FROM . ]