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 скриптов на более поздний этап (после развёртывания приложения).