using Microsoft.SqlServer.TransactSql.ScriptDom; using SQLLinter.Common; namespace SQLLinter.Infrastructure.Rules; public class JoinKeywordRule : BaseRuleVisitor, IRule { public override string Text => "Вместо неявного синтаксиса (соединения через запятую) следует использовать ключевое слово join. Замените соединения через запятую синтаксисом «INNER JOIN»."; public override void Visit(FromClause node) { // Проверьте, используются ли в соединении запятые (синтаксис неявного соединения). if (node.TableReferences.Count > 1) { for (int i = 0; i < node.TableReferences.Count; i++) { if (node.TableReferences[i] is QualifiedJoin) { // Пропустить, если это правильное ПРИСОЕДИНЕНИЕ continue; } if (i < node.TableReferences.Count - 1) { // Если следующая ссылка на таблицу не является соединением, это соединение через запятую. if (!(node.TableReferences[i + 1] is QualifiedJoin)) { AddViolation(node); break; } } } } base.Visit(node); } }