How to remove the database name as the prefix of a table within a query.
The following query works:
select USER_ID, NAME, STATUS from CSBK.dbo.T_USERS;
But I would like to know how to get this one to work without the database name:
select USER_ID, NAME, STATUS from dbo.T_USERS;
Otherwise I'm getting the following error
com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name
UPDATE
connection = DriverManager.getConnection("jdbc:sqlserver://SOMETHING.COM:1438", "CSBK", "aPassword");
ideally i would like to use only the table name without any prefix but it seems the scheme name is required by sql server.
msdn
Connect to a named database on a remote server:
jdbc:sqlserver://localhost;databaseName=AdventureWorks
which will be in your case:
jdbc:sqlserver://SOMETHING.COM:1438;databaseName=CSBK
Related
The getMetaData() or getString() function does not listen to the aliases given in my SQL query. The SQL query executes succesfully.
This is a part of my query: SELECT o.id as o_id, o.package_id as o_package_id, o.client_id as o_client_id, o.reciever_id as o_reciever_id,
resultSet.getString(fieldname) only works with id, package_id, client_id, etc., it does not work with o.id, o.package_id, o.client_id, or the field names I gave them in the query o_id, o_package_id, o_client_id.
This causes a problem, I have a query with multiple JOIN's with double field names.
How can I fetch data by aliases?
It has something to do with the JConnector.
force the driver url to have useOldAliasMetadataBehavior as true (which has default value of false in v5.1.6)
Should look like this:
url = "jdbc:mysql://localhost:3306/mydb?useOldAliasMetadataBehavior=true"
I am having problem with DB2. I just installed the db2 as a db2admin and with a password. When i try to connect to database it is success full and while running any simple select query it give me following error:-
DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.LOGIN, DRIVER=3.57.82
I have a database named onp and a table in it called 'login' in which there is one table called 'login' with two fields username and password.
Query that i am running
Select * from login; gives me error
DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.LOGIN, DRIVER=3.57.82
Select * from system.login; gives me error:- (//system is schema name)
DB2 SQL Error: SQLCODE=-551, SQLSTATE=42501, SQLERRMC=DB2ADMIN;SELECT;SYSTEM.LOGIN, DRIVER=3.57.82
I have tried all the resources on the net and exhausted completely. Please help me
I don't know a lot about DB2, but looking up the error codes...
The first error is because you didn't specify a schema, so it couldn't find the login table.
SQLCODE -204 Object not defined to DB2
DB2 apparently requires you to specify the schema name or it looks in the schema with the same name as your login user.
You must use SET SCHEMA or fully qualify the table name.
The second error is because you don't have the privileges to perform that select:
SQLCODE -551, Error: DOES NOT HAVE
THE PRIVILEGE TO PERFORM OPERATION ON
OBJECT
I'm not sure why the db2admin user wouldn't be able to select from this table...
Resources:
List of DB2 SQLCODEs
SQL CODE 551 occurred because the connecting user does not have privileges to perform operations.
Go to Control Center - Go to User Group and Object and select DB2ADMIN(assume this user is the one use to connect to DB2)
Check all the check box as the following
Grant Schema access to the user
Grant Tables access to the user
I had the same problem and i resolved it by adding Schema in my entity :
#Entity
#Table(name="MyTable", schema="MySchemaName")
public class MyClass implements Serializable {
...
}
You can also resolve the issue as:
Just give the proper authority to the user by which you are connection to DB2.
We are dealing with sybase database in core java code. We are using org.eobjects.metamodel.DataContext to parse query.
String sCol[]=table.getColumnNames();
Query query=dataContext.query().from(table.getName()).select(sCol).toQuery();
return new QueryIterator(dataContext.executeQuery(query).iterator());
But it executing query. Same code working fine with Oracle database to parse and execute query.
Some of query example generated are :
select City.CityName from ownername.City
select City.CityName from City
select CityName from ownername.City
select CityName from City
select ownername.City.CityName from ownername.City
SELECT "City"."CityName" FROM ownername."City"
select * from ownername.City
No any of above query executed. We are getting these errors :
Not capable of parsing FROM token: "ownername"."City"
Could not execute query: The column prefix '"City"' does not match with a table name or alias name used in the query. Either the table is not specified in the FROM clause or it has a correlation name which must be used instead.
Not capable of parsing SELECT token: ownername.City.CityName
How can we execute query using metamodel wih SYBASE database OR is there any other way to execute sybase queries?
Oracle (and Microsoft) use a schema logical construct that Sybase ASE does not. In SAP/Sybase ASE, all tables and columns in a database are in the same schema. It is possible to users to have their own objects in the database though, so there is the possibility of imitating some of the schema behavior using user ownership, but it would require an extra level of effort.
For Sybase the proper query syntax would be:
SELECT [ Col1, Col2 | * ]
FROM [dbName].[ownerName.]TABLE
In your case
SELECT CityName
FROM dbName.ownername.City
In Sybase ASE, it's typically best practice to have all objects owned by 'dbo', so in that case you can omit the owner from the query:
SELECT CityName
FROM dbName..City
Full query syntax and information can be found in the Query Section of the Transact SQL Users Guide in the documentation.
The error messages you're getting are coming from MetaModel's query parser layer. It is searching for matching column and table names in the metadata of your database before it's even firing the query.
I notice that you're using namespace "org.eobjects.metamodel". You should upgrade to Apache MetaModel ("org.apache.metamodel") if possible since a lot has been improved in MetaModel since it's introduction into Apache. Including a lot of query parser improvements.
I have 2 different databases one is MYSQL other is Oracle.Each have 1 table with different name and different columns name.Now I have to perform some db opeartions on each db from a single java application.Suppose for MYSQL db I have Emp table with columns Id,Name,Dept and for Oracle db I have Student table with StudentName and StudentDept.Now without changing code how can I manage 2 dbs?If I mention all db connection related data(connection url,username,password) in a properties file but to execute query I have to mention table name and column name in code.How can I manage it dynamically without altering the code so that in future any new db with different table name and column name is added I can only add the new one in properties file and no need to touch the code.Please suggest.
This might not be the prettiest, but one way to do this:
On application launch, parse properties files to get all DB connections. Store these however you want...List of connection pools, list of single connections, list of connection strings, etc...it doesn't matter.
Run a predefined stored procedure or select query to retrieve all table names from each database found in step 1. In sybase you can do this with
select name from sysobjects where type = 'U'
Build a Map where the key is the table name and the value is either the DB name, connection, connection string, or whatever you are using to manage your DB connections from the result set of #2. Anything that can be passed to your DB connection manager to identify which database it should connect to will work as the value.
In code, when table name is passed, lookup the required DB in the map
Execute query on returned DB Info in the map you created in step 3
As long as the tables are distinct in each DB this will work. Once this is setup, new DBs can be added to the properties file and the cache can be refreshed with an application restart. However, if new tables/columns are being sent to the code, how are these being passed without any code change?
When doing...
select * from students
I get a "Invalid object name" error. Basically, I think I can see the problem in that the tables are prefixed with an object name rather than just dbo, lets call the schema "test".
So this means....
select * from test.students
The problem I have is that I can't change the SQL code (it's in release, long story) or change the tables. My question is, is there anything I can change in SQL server that will allow me to connect say with a specific SQL server user so I can still run my queries as...
select * from students
Omitting the object name, but still have the object name against the table? I can add another SQL user or something like that no problem.
I'm using Java over the jdbc protocol, so my connection string is something like jdbc:sqlserver://hostname:port;databaseName=db;user=myuser;password=mypassword
Thanks,
David
You're looking for a default schema option, which doesn't exist for a given connection. That is to say that you can't say something like "until I say otherwise, unqualified tables are in the test schema". You can, however, set a default schema for a user. For your example, you'd do
alter user [myuser] with default_schema = [test]
Try to edit the connection string and set your default catalog to your "test" database
<add name="ConnectionString" connectionString="Data Source=server;Initial
Catalog=test;Persist Security Info=True;User ID=user;Password=password;"
providerName="SqlDataClient"/>