在Microsoft SQL Server 2017上执行长SQL脚本

时间:2018-09-03 13:59:18

标签: java sql-server jdbc mssql-jdbc

我需要通过Java应用程序在Microsoft SQL Server 2017的新实例上使用DDL和DML命令执行SQL脚本(约5000行),并且已经部署和配置了连接池和数据源。

寻找一种解决方案,我发现的唯一方法是将脚本加载到缓冲区中,进行读取,然后将每一行分成一个Statement,然后将每个语句分别发送到数据库实例,如{{3} }。

是否有更优雅或更简单的方法?

1 个答案:

答案 0 :(得分:0)

在研究了解决方案之后,我得出结论,对于这种特定情况,我的第一种方法是最好的。基本上,我实现了一个工厂类,该类为正在使用的数据库实例化了一个解析器类。

此解析器从SQL脚本读取每一行并将其加载到缓冲区中,评估它是注释行还是正确的行,将其添加到列表中,清除空行,然后最终在两个{{1}之间构建每个命令}语句,将这些行附加并传递到另一个将在最后返回的列表。

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; } } 并单独执行。