2014-10-06 40 views
0

我正在使用Apache Tomcat 7.0.41,需要使用官方「com.microsoft.sqlserver.jdbc.SQLServerDriver」-Driver在SQL Server 2012上生成視圖。 不幸的是,選擇Schema似乎有問題。我嘗試了幾種方法來完成它,但它每次都失敗。在指定的MSSQL架構中創建視圖

奇怪的是定期創建表的不會引起任何麻煩:

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

試圖做搜索一樣。 (供參考:語句本身和該表名都被分離final Strings,可單獨改變) :

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

失敗,錯誤:

com.microsoft.sqlserver.jdbc.SQLServerException: 'CREATE/ALTER VIEW' does not allow specifying the database name as a prefix to the object name.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)

離開數據庫名稱完全放創建視圖在「主」 - 數據庫這不完全是我想要的。

的錯誤是常見的,http://www.sql-server-helper.com/error-messages/msg-166.aspx提示:

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

到:

To avoid this error, remove the database name when creating a view: [...] If you need to create a view on another database, change your database first then create the view without the database name:

USE Northwind 
GO 

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

我已經開始整個SQL命令

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

它得到錯誤:

com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'GO'.

我不知道如果我的「\ n的是不是爲SQL-服務器不夠漂亮......我無法弄清楚,爲什麼語法應該是不正確的,所以我插入了整個SQL導入SQL-Management Studio ...並且它工作正常!

我很難理解爲什麼同一個命令在Studio中工作,但如果在Java中執行則不行? 的命令是直線前進(我使用的是那些準備定期報表,而不是因爲我不插入任何價值觀和我所有的字符串是決賽):

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

的官方文檔(http://msdn.microsoft.com/en-us/library/ms187956.aspx - 見「的例子「部分)是指在GO模式之後使用分號的情況。 但改成:

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

給我完全一樣的錯誤。離開'\ n'也沒有效果。

看來有人遇到過類似的問題,前一陣子: How can I specify the current schema for sql server in a jboss data source url?

我以前沒有與同義詞工作,我不認爲這是我的問題的正確方法。有沒有更優雅的解決方案?

謝謝

回答

2

語句等USE可以在技術上JDBC使用。但是,您不能使用GO,因爲它不是SQL Server T-SQL語法的一部分;它實際上是SQL Server Management Studio的一部分,以及SQL Server的一些腳本工具。

但是直接使用影響連接的狀態命令(包括其他類似的交易(開始,提交回滾))被強烈JDBC勸阻:

Note: When configuring a Connection , JDBC applications should use the appropriate Connection method such as setAutoCommit or setTransactionIsolation . Applications should not invoke SQL commands directly to change the connection's configuration when there is a JDBC method available. (from java.sql.Connection)

如果你想切換數據庫,可以使用​​。這種方式連接知道它現在連接到不同的目錄。如果使用USE來代替,則驅動程序可能仍然認爲它連接到了初始數據庫並執行了錯誤的操作(例如,爲錯誤的數據庫緩存元數據等)。

當然其他選項描述在the answer by Donal:直接連接到正確的數據庫。

+0

你說得對 - 我以前從來沒有處理過USE和GO命令高興不要再使用它)。然而,@Donai的回答並不適合我,但是在目錄設置中它按照它應該進行的方式進行。 – Qohelet 2014-10-07 19:42:21

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) 
) 
+0

看起來SQL-Server導致Schema/DB-Options出現問題,它不起作用... – Qohelet 2014-10-07 19:34:32