Use Database
-
giovedì 5 aprile 2012 08:42
Hi,
i have many database in my Sql server 2000 all database are the same name the only thing is the year is change in the database name ex. H0012012
my question is.
i wold like to use union form some tables from 2 years
i tried this but did not work
declare @db__Name varchar(10)
declare @DBName varchar(50)
SET @db__Name = 'H001' + CONVERT(varchar(4),(YEAR({ fn NOW()})))SET @DBName=(Select Name From sysdatabases Where name like @db__Name)
USE @DBName
i get this error
Server: Msg 170, Level 15, State 1, Line 13
Line 13: Incorrect syntax near '@ DBName'.any help
thanks in advance
Gio
Tutte le risposte
-
giovedì 5 aprile 2012 19:08Moderatore
i wold like to use union form some tables from 2 years
Gio
Ciao Gio,
Probabilmente ho interpretato male il tuo quesito, ma per eseguire l'unione di due tabelle, non puoi ricorrere all'operatore UNION?
CREATE DATABASE DB1; CREATE DATABASE DB2; GO USE DB1; GO CREATE TABLE dbo.Students1( StudentID int NOT NULL PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL ); INSERT dbo.Students1 VALUES (1, 'Lorenzo', 'Benaglia') , (2, 'Andrea', 'Montanari'); GO USE DB2; GO CREATE TABLE dbo.Students2( StudentID int NOT NULL PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL ); INSERT dbo.Students2 VALUES (3, 'Marcello', 'Poletti') , (4, 'Gianluca', 'Hotz'); GO USE DB1; GO SELECT * FROM dbo.Students1 UNION ALL SELECT * FROM DB2.dbo.Students2; /* Output: StudentID FirstName LastName ----------- ---------- ---------- 1 Lorenzo Benaglia 2 Andrea Montanari 3 Marcello Poletti 4 Gianluca Hotz (4 row(s) affected) */ USE master; GO DROP DATABASE DB1, DB2;
Ciao!
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo
http://social.technet.microsoft.com/Forums/it-IT/sqlserverit -
venerdì 6 aprile 2012 07:24
Grazie Lorenzo per la tua risposta
allora la mia domanda è
non sapendo il nome del DB, come uso
declare @DBName1 varchar(50)
declare @DBName1 varchar(50)
SET DBName1 = 'H001' + CONVERT(varchar(4),(YEAR({ fn NOW()}))) -- H0012012SET DBName2 = 'H001' + CONVERT(varchar(4),(YEAR({ fn NOW()})-1)) -- H0012011
per c ollegare due tabelle da due DB diversi o fare la UNION
esempio:1
SELECT StudentID ,FirstName ,LastName FROM @DBName1
INNER JOIN @DBName2 ON @DBName1.StudentID = @DBName2 .StudentID WHERE (ect.... )
esempio:2
SELECT StudentID ,FirstName ,LastName FROM (SELECT StudentID ,FirstName ,LastName FROM @DBName1
UNION
SELECT StudentID ,FirstName ,LastName FROM @DBName2 ) AS #Table1
...
Grazie di nuovo
Gio
-
venerdì 6 aprile 2012 09:04Moderatore
allora la mia domanda è
non sapendo il nome del DB
Ciao Gio,
Non capisco come tu non possa conoscere il nome di un db e pretendere di accedervi.
Il codice che hai postato non può funzionare a meno di creare un intero batch via Dynamic SQL ed eseguirlo via EXECUTE o sp_executesql ma non ne comprendo il motivo.
Ciao!
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo
http://social.technet.microsoft.com/Forums/it-IT/sqlserverit -
venerdì 6 aprile 2012 09:32
Ciao Lorenzo!
mi spiego meglio, tutti i database presenti in sql server 2000 sono divisi per esercizio ( H0012012 - H0012011 - H0012010 ect...), allora certe tabelle presenti nel DB H0012012 fanno riferimento al DB H0012011 e cosi via.
le viste create su sql server va eseguita alla apertura di un foglio excel che legge i dati della vista presente in sql server.
è ovvio che non e possibile cambiare ogni anno le viste create su sql server con il nome corretto del db es. H0012013allora se devo utilizare EXECUTE o sp_executesql mi poi dire come fare grazie mille
Gio
Gio
mi sa che sto chiedendo una cosa quasi impossibile vero :)- Modificato Gio71 venerdì 6 aprile 2012 10:17
-
venerdì 6 aprile 2012 19:28Moderatore
mi spiego meglio, tutti i database presenti in sql server 2000 sono divisi per esercizio ( H0012012 - H0012011 - H0012010 ect...), allora certe tabelle presenti nel DB H0012012 fanno riferimento al DB H0012011 e cosi via.
le viste create su sql server va eseguita alla apertura di un foglio excel che legge i dati della vista presente in sql server.
è ovvio che non e possibile cambiare ogni anno le viste create su sql server con il nome corretto del db es. H0012013Si, ma io non ho ancora capito da quali e quanti db devi eseguire le query.
Ad esempio, se hai 10 anni (quindi 10 db) devi fare la UNION tra 10 tabelle (una per db)?
Ciao!
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo
http://social.technet.microsoft.com/Forums/it-IT/sqlserverit -
venerdì 6 aprile 2012 22:03
ecco diciamo come minimo 3 db e la union o la join normale e tra 4 o 5 tabelle da ogni db,
so che sql e molto complesso e non è come access che fa i collegamenti, io sto provando di riportare le query fatte in access a sql server ovviamente se è possibile
grazie
ciao!
Gio
-
giovedì 19 aprile 2012 19:26
Ciao Gio,
allora premettiamo che SQL server non permette di per se di rendere dinamico il nome del database in questo modo.
Come giustamente Lorenzo accennava, farei così (2 modalità - una con i CURSORI - old style, l'altra più smart).
declare @dynSQL varchar(8000) DECLARE curDbNames CURSOR READ_ONLY FOR select name from master..sysdatabases where name like 'H001%' OPEN curDbNames declare @dbName varchar(200) FETCH NEXT FROM curDbNames INTO @dbName WHILE @@FETCH_STATUS = 0 BEGIN if (LENGTH(@dynSQL) > 0) SET @dynSQL = @dynSQL + " UNION ALL " SET @dynSQL = @dynSQL + "SELECT * FROM " + @dbName + "..Studenti" FETCH NEXT FROM curDbNames INTO @dbName END DEALLOCATE curDbNames -- ora la tua query ha tutte le union che ti servono sp_executesql @dynSQL
La seconda soluzione che ti propongo è MOLTO più elegante, ma più complessa da capire probabilmente usando il COALESCE vengono unite automaticamente "più righe" su una unica variabile @sql, ... ecco:
declare @sql varchar(8000) select @sql = coalesce(@sql +' UNION ALL ', '') + 'select '''+name+''' as DatabaseName, count(*) as ObjectsCount from ' + name + '..sysobjects' from master..sysdatabases exec(@sql)
La prima non l'ho provata, la seconda invece ti confermo che funziona bene!
Good luck!
PS(2): Ovvio che le tabelle qui devono avere la STESSA STRUTTURA!
Ciao
Adriano
- Modificato Adriano Trevisan 75 giovedì 19 aprile 2012 19:27 aggiuto il PS(2)
- Modificato Adriano Trevisan 75 giovedì 19 aprile 2012 19:40 Altra soluzione.
- Modificato Adriano Trevisan 75 giovedì 19 aprile 2012 19:42
- Modificato Adriano Trevisan 75 giovedì 19 aprile 2012 19:43

