在指定的MSSQL-Schema中创建View

时间:2014-10-06 22:15:56

标签: java sql-server jdbc view database-schema

我使用的是Apache Tomcat 7.0.41,需要使用官方的“com.microsoft.sqlserver.jdbc.SQLServerDriver”-Driver在SQL Server 2012上生成View。 不幸的是,选择Schema时似乎存在问题。我已经尝试了几种方法来实现它,但它每次都失败了。

奇怪的是,定期创建表格不会造成任何麻烦:

CREATE TABLE Defschem.dbo.Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)

尝试以相同的方式进行查看。 (fyi:Statement本身和表名都是分开的final Strings,可以单独更改) :

Create View Defschem.dbo.EtiFormatview as 
SELECT 
...
 FROM Defschem.dbo.Formate  
...

因错误而失败:

  

com.microsoft.sqlserver.jdbc.SQLServerException:'CREATE / ALTER VIEW'   不允许将数据库名称指定为对象的前缀   名。
  在   com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)

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

错误很常见且http://www.sql-server-helper.com/error-messages/msg-166.aspx建议:

  

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

USE Northwind
GO

CREATE VIEW [dbo].[CustomerCountries]
AS
SELECT DISTINCT [Country]
FROM [dbo].[Customers]
GO

我用:

启动了整个SQL命令
"USE " + DATABASENAME + '\n' + "GO " + '\n';

为:

USE Defschem
GO 
Create View Defschem.dbo.EtiFormatview as 
    SELECT 
    ...
     FROM Defschem.dbo.Formate  
    ...

收到错误:

  

com.microsoft.sqlserver.jdbc.SQLServerException:附近的语法不正确   'GO'。

我不确定我的'\ n'对于SQL-Server来说不够漂亮......我无法弄清楚为什么语法应该是不正确的,所以我将整个SQL插入到SQL中 - 管理工作室......和它一起工作!

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

stat = c.createStatement();
stat.executeUpdate(Info.getUsage()+VIEW);
c.commit();

官方文档(http://msdn.microsoft.com/en-us/library/ms187956.aspx - 参见“示例”部分)是指在GO SCHEMA之后使用分号的情况。 但改为:

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

给了我完全相同的错误。离开'\ n'也没有效果。

前一段时间似乎有人遇到过类似的问题: How can I specify the current schema for sql server in a jboss data source url?

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

谢谢

2 个答案:

答案 0 :(得分:2)

USE之类的语句在技术上可以在JDBC中使用。但是,您不能使用GO,因为这不是SQL Server T-SQL语法的一部分;它实际上是SQL Server Management Studio的一部分,也是SQL Server的一些脚本工具。

但是,强烈建议不要直接使用影响连接状态的命令(包括其他类似的事务(启动,提交回滚)):

  

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

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

其他选项当然在the answer by Donal中描述:直接连接到正确的数据库。

答案 1 :(得分:1)

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

例如:

String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);

连接到数据库后,您无需在SQL中使用它。您不需要使用模式名称 - dbo是SQL Server中的默认模式,您可以将其保留。

例如:

CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)