我使用的是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?
我之前没有使用过同义词,我认为这不是我的问题的正确方法。有更优雅的解决方案吗?
谢谢
答案 0 :(得分:2)
USE
之类的语句在技术上可以在JDBC中使用。但是,您不能使用GO
,因为这不是SQL Server T-SQL语法的一部分;它实际上是SQL Server Management Studio的一部分,也是SQL Server的一些脚本工具。
但是,强烈建议不要直接使用影响连接状态的命令(包括其他类似的事务(启动,提交回滚)):
注意:配置
Connection
时,JDBC应用程序应使用适当的连接方法,例如setAutoCommit
或setTransactionIsolation
。当存在可用的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)
)