Выполнение длинного сценария SQL на Microsoft SQL Server 2017 - PullRequest
0 голосов
/ 03 сентября 2018

Мне нужно выполнить сценарий SQL (~ 5000 строк) с командами DDL и DML на новом экземпляре Microsoft SQL Server 2017 через приложение Java, уже с развернутыми и настроенными пулами соединений и источниками данных.

Поиск решения. Единственный метод, который я нашел, это загрузить скрипт в буфер, прочитать его и разбить каждую строку на оператор, а затем отправить каждый из этих операторов по отдельности в экземпляр базы данных, как в this пример .

Есть ли более элегантный или простой способ сделать это?

1 Ответ

0 голосов
/ 12 сентября 2018

После поиска решения я пришел к выводу, что мой первый подход будет наилучшим для этого конкретного случая. По сути, я реализовал фабричный класс, который создает класс синтаксического анализатора для используемой базы данных.

Этот синтаксический анализатор читает каждую строку из сценария SQL и загружает ее в буфер, оценивая, является ли она комментарием или правильной строкой, добавляет ее в список, очищает пустые строки и, наконец, строит каждую команду между двумя операторами GO добавив строки и передав их в другой список, который будет возвращен в конце.

package parsing;

import java.io.*
import java.util.*

public class ScriptParser implements Parser {

private static ArrayList<String> listOfQueries = null;

@Override
public ArrayList<String> createQueries(String path) {
    String queryLine = new String();
    StringBuilder sBuffer = new StringBuilder();
    listOfQueries = new ArrayList<>();
    List<String> dirtyQueries = new ArrayList<>();

    try {
        FileReader fr = new FileReader(new File(path));
        BufferedReader br = new BufferedReader(fr);
        while ((queryLine = br.readLine()) != null) {
            if (queryLine.contains("--") || queryLine.contains("/*")) {
                queryLine = "";
                dirtyQueries.add(queryLine);
            } else {
                dirtyQueries.add(queryLine + " ");
            }
        }
        br.close();
        for (Iterator<String> iter = dirtyQueries.listIterator(); iter.hasNext();) {
            //TODO
            String str = iter.next();
            if (str.isEmpty() || str.trim().isEmpty()) {
                iter.remove();
            } else {
                //DO NOTHING
            }
        }

        StringBuilder queryStatement = new StringBuilder();
        for (int i = 0; i < dirtyQueries.size(); i++) {
            //TODO
            if (!dirtyQueries.get(i).contains("GO") || !dirtyQueries.get(i).contains("GO ")) {
                queryStatement.append(dirtyQueries.get(i)).append(" ");
            } else {
                listOfQueries.add(queryStatement.toString());
                queryStatement = new StringBuilder();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println(sBuffer.toString());
    }
    return listOfQueries;
  }
}    

Затем каждая запись в списке зацикливается и передается в Statement и выполняется индивидуально.

...