Java 创建/更改程序';必须是查询批处理中的第一条语句

Java 创建/更改程序';必须是查询批处理中的第一条语句,java,sql,sql-server,Java,Sql,Sql Server,我必须如何在java中构造sql查询才能执行多个create语句 以下是我现在拥有的: public static String CreateDatabaseOfflinerObjects(boolean createTables){ String result = createTables ? "CREATE TABLE [dbo].[ofLastMessageTime](" +

我必须如何在java中构造sql查询才能执行多个create语句

以下是我现在拥有的:

public static String CreateDatabaseOfflinerObjects(boolean createTables){

    String result = createTables 
            ? 
                    "CREATE TABLE [dbo].[ofLastMessageTime](" +
                       "[id] [int] IDENTITY(1,1) NOT NULL," +
                       "[receiverJid] [nvarchar](max) NOT NULL," +
                       "[senderJid] [nvarchar](max) NOT NULL," +
                       "[lastDeliveredTime] [bigint] NULL," +
                       "[lastReadTime] [bigint] NULL," +

                       "CONSTRAINT [ofLastMessageTime_pk] PRIMARY KEY CLUSTERED " +
                       "(" +
                            "[id] ASC" +
                        ")"+
                        "WITH ("+
                                "PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]"+
                              ")" + 
                        "ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] " 
            : "";

    result += 
               (
                  " ; " +

                    "CREATE PROCEDURE [dbo].[UpdateDeliveredStatus] " +

                            "@receiverJid  nvarchar(MAX), " +
                            "@senderJid  nvarchar(MAX), " +
                            "@lastDeliveredTime bigint " +
                            "AS " +
                            "BEGIN " +

                            "SET NOCOUNT ON; " +

                            "UPDATE ofLastMessageTime " +
                            "SET lastDeliveredTime = @lastDeliveredTime " +
                            "WHERE senderJid = @senderJid " +
                            "AND receiverJid = @receiverJid " +

                            "IF @@ROWCOUNT=0 "  +
                            "INSERT INTO ofLastMessageTime ( receiverJid, senderJid, lastDeliveredTime ) " +
                            "VALUES ( @receiverJid,     @senderJid , @lastDeliveredTime ) "+

                        "END" +

                   "; " +

                    "CREATE PROCEDURE [dbo].[UpdateReadStatus] " +

                        "@receiverJid  nvarchar(MAX), " +
                        "@senderJid  nvarchar(MAX), " +
                        "@lastReadTime bigint " +
                        "AS " +
                        "BEGIN " +

                        "SET NOCOUNT ON; " +

                        "UPDATE ofLastMessageTime " +
                        "SET lastReadTime = @lastReadTime " +
                        "WHERE senderJid = @senderJid " +
                        "AND receiverJid = @receiverJid " +

                        "IF @@ROWCOUNT=0 "  +
                        "INSERT INTO ofLastMessageTime ( receiverJid, senderJid, lastReadTime ) " +
                        "VALUES ( @receiverJid,     @senderJid , @lastReadTime ) "+

                    "END" +
                     "; "
              );

    return result;
}

我知道必须使用分隔符,我读到一些关于java sql的地方,我可以使用分号,但这对我没有帮助。谢谢。

我不相信你能在一个大的语句中做到这一点,除非你的Sql连接技术(如jdbc/CallableStatement等)支持一个分隔符标记,它会隐式地使用它来分隔批(如
GO
在使用
SSMS
等工具时所做的)

您需要做的是为每个单独创建的表返回
DDL
(例如,作为字符串的集合或数组),然后分别执行每个
create
(例如,在循环中,如果您使用了集合方法)。您不需要每次都创建一个新连接


如果需要全部或全无结果,您还可以将DDL命令序列包装在单个ACID事务下。

我相信您可以尝试在Java JDBC批处理中这样做

我相信代码应该是这样的:

import java.sql.*;

public class jdbcConn {
    public static void main(String[] args) throws Exception{
      Class.forName("org.apache.sqlserver.jdbc.ClientDriver");
      Connection con = DriverManager.getConnection
      ("jdbc:sqlserver://localhost;databaseName=test;integratedSecurity=true;");
      Statement stmt = con.createStatement
      (ResultSet.TYPE_SCROLL_SENSITIVE,
      ResultSet.CONCUR_UPDATABLE);
      String createTable1 = "CREATE TABLE [dbo].[ofLastMessageTime](" +
                   "[id] [int] IDENTITY(1,1) NOT NULL," +
                   "[receiverJid] [nvarchar](max) NOT NULL," +
                   "[senderJid] [nvarchar](max) NOT NULL," +
                   "[lastDeliveredTime] [bigint] NULL," +
                   "[lastReadTime] [bigint] NULL," +

                   "CONSTRAINT [ofLastMessageTime_pk] PRIMARY KEY CLUSTERED " +
                   "(" +
                        "[id] ASC" +
                    ")"+
                    "WITH ("+
                            "PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]"+
                          ")" + 
                    "ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]";
      String createProc1 = "CREATE PROCEDURE [dbo].[UpdateDeliveredStatus] " +

                        "@receiverJid  nvarchar(MAX), " +
                        "@senderJid  nvarchar(MAX), " +
                        "@lastDeliveredTime bigint " +
                        "AS " +
                        "BEGIN " +

                        "SET NOCOUNT ON; " +

                        "UPDATE ofLastMessageTime " +
                        "SET lastDeliveredTime = @lastDeliveredTime " +
                        "WHERE senderJid = @senderJid " +
                        "AND receiverJid = @receiverJid " +

                        "IF @@ROWCOUNT=0 "  +
                        "INSERT INTO ofLastMessageTime ( receiverJid, senderJid, lastDeliveredTime ) " +
                        "VALUES ( @receiverJid,     @senderJid , @lastDeliveredTime ) "+

                    "END";
      con.setAutoCommit(false);
      stmt.addBatch(createTable1);
      stmt.addBatch(createProc1);
      stmt.executeBatch();
      con.commit();
      System.out.println("Batch executed");
      }
} 

我认为,如果您在
创建之后放置一个
GO
,并且在每个
PROC
创建
GO
is之后放置一个
GO
,那么这应该是可行的-它只是一个分隔符标记-例如,在下拉列表中查看更改它的选项:-)