Вот как я решил это с помощью регулярного выражения.
var statements = Regex.Split(sql, @"^\s*GO\s*$",
RegexOptions.IgnoreCase | RegexOptions.Multiline);
Это разделяется на "GO", когда он находится на своей собственной линии и, возможно, окружен пробелами. Похоже, что это правила, применяемые SSMS - размещение GO
в строке с любым другим оператором приводит к ошибке (точка с запятой или нет).
Обратите внимание, что он по-прежнему сломается, если ваш скрипт содержит операторы GO в отдельной строке внутри комментариев блока. Это единственная ошибка, о которой я могу подумать.
Пуленепробиваемым решением будет использование SMO, как подробно описано в этом ответе .