TSql150Parser.Parse не находит ошибку

Я пытаюсь прикрутить TSql150Parser.Parse для валидации sql запросов - тесты будут чекать их.

Взял за основу: https://stackoverflow.com/a/33834869/6836124
Текущий мой вариант: https://dotnetfiddle.net/JQBH9D

Он же:

//reference Microsoft.SqlServer.DacFx.x64 latest version

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 " +
                    "errorString " +
                    "errorString2 " +
            "/*The variable name '@NEW_VERSION_NUMBER' has already been declared." +
            "Variable names must be unique within a query batch or stored procedure.*/";
        
        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();
    }
}

Ожидал, что будет The variable name '@NEW_VERSION_NUMBER' has already been declared
А на деле: Incorrect syntax near errorString.

Почему первая ошибка пропускается?


Ответы (1 шт):

Автор решения: Артём Гродецкий

Задал этот же вопрос в англоязычной версии stackoverflow: https://stackoverflow.com/a/64030517/6836124

Спасибо JeroenMostert за комментарий:

...you get no error because the parser validates syntactical validity only. That redeclaring a variable is illegal is a semantic property, that requires executing it with an engine. This is not really specific to T-SQL; in most languages the syntax layer would not be responsible for variable scopes.

Я для себя решил: с помощью этого парсера невозможно отловить ошибки данного типа (только синтаксические ошибки). Я перенесу валидацию и более полную проверку sql скриптов на более поздний этап (после развёртывания приложения).

→ Ссылка