Domanda 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:08
    Moderatore
     
      Contiene codice

    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
     
      Contiene codice

    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()}))) -- H0012012

    SET 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:04
    Moderatore
     
     

    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. H0012013 

    allora 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:28
    Moderatore
     
     

    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. H0012013

    Si, 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
     
      Contiene codice

    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