下面是我传递给命令的函数,用于验证字符串是否是有效的SQL查询。
using Microsoft.SqlServer.TransactSql.ScriptDom;
using ParseError = Microsoft.SqlServer.TransactSql.ScriptDom.ParseError;
namespace QueryStore.Application.Utils;
internal static class SqlParser
{
internal static List<string>? Parse(string sql)
{
var parser = new TSql100Parser(false);
parser.Parse(new StringReader(sql), out IList<ParseError> errors);
return errors is not { Count: > 0 } ? null : errors.Select(error => error.Message).ToList();
}
internal static bool BeValidSqlQuery(string content)
{
var result = SqlParser.Parse(content);
return result is null;
}
}
此输入给出错误:"Select From XYZ"
下面是它接受的一些输入字符串
"sdcsdcsdcsdcsjnjkc"
"csdcsdc sdcsdcsdc"
我如何才能避免这种情况发生。是否有其他现有的函数或其他库可以使用?
1条答案
按热度按时间z31licg01#
我也在做这件事。我担心的是Parse所做的事情。
Parse方法确实验证输入,但是它处理的不仅仅是sql语句。当你给予你提到的字符串时,它被识别为标识符,所以字符串将作为TSqlFragment返回。这就是为什么没有错误。
当你输入像123和abc这样的随机单词时,它也会返回错误,不是因为它是不正确的sql,而是因为它不能被正确地识别为标识符。
要使用Parse验证sql,您需要给予进一步的验证,例如检查它是否继承自TSqlStatement。您可以编写scriptTokenStream的子级的文本和类型来检查验证过程。
ParseStatementList方法是只验证SQL的简单而正确的方法。它将返回StatementList的对象,其中每个句子都继承自TSqlStatement。