Java 在指定的MSSQL架构中创建视图

Java 在指定的MSSQL架构中创建视图,java,sql-server,jdbc,view,database-schema,Java,Sql Server,Jdbc,View,Database Schema,我使用的是ApacheTomcat7.0.41,需要在SQLServer2012上生成一个带有官方“com.microsoft.sqlserver.jdbc.SQLServerDriver”驱动程序的视图。 不幸的是,选择模式似乎有问题。我试过几种方法来实现它,但每次都失败了 奇怪的是,定期创建表不会引起任何问题: CREATE TABLE Defschem.dbo.Formate ( [FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [I

我使用的是ApacheTomcat7.0.41,需要在SQLServer2012上生成一个带有官方“com.microsoft.sqlserver.jdbc.SQLServerDriver”驱动程序的视图。 不幸的是,选择模式似乎有问题。我试过几种方法来实现它,但每次都失败了

奇怪的是,定期创建表不会引起任何问题:

CREATE TABLE Defschem.dbo.Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
尝试以相同的方式查看。 (仅供参考:语句本身和表名都是分开的
最终字符串
,可以单独更改) :

失败,错误为:

com.microsoft.sqlserver.jdbc.SQLServerException:“创建/更改视图” 不允许将数据库名称指定为对象的前缀 姓名。
在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)

保留数据库名称会将创建的视图完全放在“master”数据库中,这并不是我想要的

该错误很常见,提示:

要避免此错误,请在创建视图时删除数据库名称: […]如果需要在另一个数据库上创建视图,请更改 首先创建数据库,然后创建不带数据库名称的视图:

我用以下命令启动了整个SQL命令:

"USE " + DATABASENAME + '\n' + "GO " + '\n';
致:

它将获得以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException:附近语法不正确 “走”

我不确定我的'\n'对于SQL Server是否不够漂亮。。。我不明白为什么语法不正确,所以我将整个SQL插入了SQL Management Studio。。。成功了

我很难理解为什么一个相同的命令可以在Studio中工作,但如果用Java执行就不行了? 该命令是直接的(我使用常规语句而不是准备好的语句,因为我不插入任何值,所有字符串都是最终的):

官方文档(参见“示例”部分)指的是在GO模式之后使用分号的情况。 但改变为:

"USE " + DATABASENAME + ";\n" + "GO " + '\n';
给了我完全相同的错误。离开“\n”也没有效果

不久前似乎有人遇到了类似的问题:

我以前没有研究过同义词,我认为这不是解决我问题的正确方法。有更优雅的解决方案吗


谢谢

您可以将数据库名称指定为连接字符串的一部分。这意味着您不需要
USE
语句,因为连接字符串中的数据库是您当前的数据库

例如:

String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
一旦连接到数据库,就不需要在SQL中使用它。您也不需要使用模式名-dbo是SQL Server中的默认模式,您可以不使用它

例如:

String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)

可以将数据库名称指定为连接字符串的一部分。这意味着您不需要
USE
语句,因为连接字符串中的数据库是您当前的数据库

例如:

String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
一旦连接到数据库,就不需要在SQL中使用它。您也不需要使用模式名-dbo是SQL Server中的默认模式,您可以不使用它

例如:

String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)

可以将数据库名称指定为连接字符串的一部分。这意味着您不需要
USE
语句,因为连接字符串中的数据库是您当前的数据库

例如:

String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
一旦连接到数据库,就不需要在SQL中使用它。您也不需要使用模式名-dbo是SQL Server中的默认模式,您可以不使用它

例如:

String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)

可以将数据库名称指定为连接字符串的一部分。这意味着您不需要
USE
语句,因为连接字符串中的数据库是您当前的数据库

例如:

String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
一旦连接到数据库,就不需要在SQL中使用它。您也不需要使用模式名-dbo是SQL Server中的默认模式,您可以不使用它

例如:

String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)

USE
这样的语句在技术上可以在JDBC中使用。但是,不能使用
GO
,因为这不是SQL Server T-SQL语法的一部分;它实际上是SQLServerManagementStudio和许多SQLServer脚本工具的一部分

但是,JDBC强烈反对直接使用影响连接状态的命令(包括其他命令,如事务(启动、提交回滚)):

注意:配置
连接时,JDBC应用程序应使用适当的连接方法,如
setAutoCommit
setTransactionIsolation
。当存在可用的JDBC方法时,应用程序不应直接调用SQL命令来更改连接的配置。(来自)

如果要切换数据库,可以使用。这样,连接就知道它现在已连接到其他目录。如果您使用
USE
执行此操作,则驱动程序可能仍然认为它已连接到初始数据库,并执行错误的操作(例如为错误的数据库缓存元数据等)


当然,另一个选项如中所述:直接连接到正确的数据库。

USE
这样的语句在技术上可以在JDBC中使用。但是,不能使用
GO
,因为这不是SQL Server T-SQL语法的一部分;它实际上是SQLServerManagementStudio和许多SQLServer脚本工具的一部分

但是,JDBC强烈反对直接使用影响连接状态的命令(包括其他命令,如事务(启动、提交回滚)):

注意:配置
连接时,JDBC应用程序应使用适当的连接方法,如
setAutoCommit
setT