Java 创建/更改程序';必须是查询批处理中的第一条语句
我必须如何在java中构造sql查询才能执行多个create语句 以下是我现在拥有的: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](" +
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
,那么这应该是可行的-它只是一个分隔符标记-例如,在下拉列表中查看更改它的选项:-)