I'm trying to use TSql150Parser.Parse() to validate sql queries - unit tests will check queries.
I took as a basis: https://stackoverflow.com/a/33834869/6836124 My current version: https://dotnetfiddle.net/1Anhh9
Same code:
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();
}
}
I expected there to be an error: The variable name '@NEW_VERSION_NUMBER' has already been declared But in fact there is no error.
Why is the first error being skipped?