我正在尝试使用TSql150Parser.Parse()验证sql查询-单元测试将检查查询。
我以此为依据:https://stackoverflow.com/a/33834869/6836124 我当前的版本:https://dotnetfiddle.net/1Anhh9
相同的代码:
using Microsoft.SqlServer.TransactSql.ScriptDom;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
public class Program
{
public static void Main()
{
var query = "DECLARE @NEW_VERSION_NUMBER int = 1;"+
"DECLARE @NEW_VERSION_NUMBER int = 1;";
IList<string> errors;
var result = query.IsValidSql(out errors);
Console.WriteLine(result);
Console.WriteLine(string.Join("; ", errors.ToArray()));
}
}
public static class SqlStringExtensions
{
public static bool IsValidSql(this string query, out IList<string> errors)
{
if (string.IsNullOrWhiteSpace(query)) throw new ArgumentNullException("asdasd");
IList<ParseError> parseErrors;
using (var reader = new StringReader(query))
{
new TSql150Parser(false).Parse(reader, out parseErrors);
}
errors = parseErrors.Select(err => err.Message).ToList();
return !errors.Any();
}
}
我希望会出现错误:变量名'@NEW_VERSION_NUMBER'已被声明 但实际上没有错误。
为什么第一个错误被跳过?
答案 0 :(得分:0)
我将回答我自己的问题,并附上我最近的评论:
谢谢@JeroenMostert!似乎无法使用此解析器捕获重新声明变量错误。我将尝试将sql验证(使用引擎)移至系统部署后的步骤。