Я работаю над приложением OSS на основе Java SqlHawk, одной из функций которого является запуск обновленных sql-скриптов. против сервера.
Microsoft взяла за правило разбивать скрипт на пакеты с помощью оператора GO, что является хорошей идеей, но просто требует ложных совпадений в строке.
На данный момент у меня есть очень рудиментарный:
// split where GO on its own on a line
Pattern batchSplitter = Pattern.compile("^GO", Pattern.MULTILINE);
...
String[] splitSql = batchSplitter.split(definition);
...
какой вид работает, но склонен сбивать с толку такими вещами, как цитируемые операторы GOили проблемы с отступами.
Я думаю, что единственный способ сделать это действительно надежным — это иметь в приложении анализатор SQL, но я понятия не имею, как это сделать, и может ли это на самом деле оказаться менее надежным (особенно с учетом того, что этот инструмент поддерживает несколько СУБД).
Каким образом я могу решить эту проблему? Примеры кода были бы очень полезны для меня здесь.
Соответствующий код sqlHawkна github.
В настоящее время используется jtdsдля выполнения пакетов, найденных в сценариях.