【发布时间】:2014-10-06 22:15:55
【问题描述】:
我使用的是 Apache Tomcat 7.0.41,需要使用官方“com.microsoft.sqlserver.jdbc.SQLServerDriver”驱动程序在 SQL Server 2012 上生成视图。 不幸的是,选择架构似乎有问题。我尝试了几种方法来完成它,但每次都失败了。
奇怪的是,定期创建表不会造成任何麻烦:
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' 不允许将数据库名称指定为对象的前缀 名字。
在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
完全保留数据库名称会将创建的视图放入“主”数据库中,这并不是我想要的。
错误很常见,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:附近的语法不正确 '去'。
我不确定我的 '\n 是否对于 SQL-Server 来说不够漂亮...我不明白为什么语法应该不正确,所以我将整个 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 SCHEMA 之后使用分号的情况。 但是改为:
"USE " + DATABASENAME + ";\n" + "GO " + '\n';
给了我完全相同的错误。离开 '\n's 也没有效果。
似乎有人不久前遇到了类似的问题: How can I specify the current schema for sql server in a jboss data source url?
我以前没有使用过同义词,我认为这不是解决我的问题的正确方法。有没有更优雅的解决方案?
谢谢
【问题讨论】:
标签: java sql-server jdbc view database-schema