TSql150Parser.Parse()找不到错误

时间:2020-09-23 08:37:53

标签: c# sql-server

我正在尝试使用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'已被声明 但实际上没有错误。

为什么第一个错误被跳过?

1 个答案:

答案 0 :(得分:0)

我将回答我自己的问题,并附上我最近的评论:

谢谢@JeroenMostert!似乎无法使用此解析器捕获重新声明变量错误。我将尝试将sql验证(使用引擎)移至系统部署后的步骤。