PDA

View Full Version : [SQL Server] Sottorichiesta su QUERY


race2
11-03-2006, 14:44
Salve, ho una problema troppo complicato per me,

Ho 2 Database:
------------------
DB1 : contiene una Tabella dove ci sono scritti dei nomi di altre 2000 Tabelle.

DB2 : contiene le 2000 Tabelle elencate nel DB1 (come detto sopra...),
in ognuna delle 2000 tabelle sono scritti +/- 1000 Record.

Cosa devo ottenere:

una QUERY che mi restituisce il nome-Tabella e il COUNT(*) dei record per ognuna delle 2000 Tabelle.

cioe' la visualizzazione sara:

Table_1 | 1023
Table_2 | 756
Table_3 | 983
Table_4 | 1733
Table_5 | 1066


il quale risultato io ho provato a estrarre in questo modo:


SELECT NomeTabella, (SELECT COUNT(*)AS Valore FROM Table_1) FROM TabellaElencoNomi


Come si puo' intuire al volo la (SELECT interna) conteggia solo la Table_1,
come posso fare perche' la SELECT esterna passi alla (SELECT interna) il NomeTabella in modo da CONTARE i record della tabella passata ???

Emyl
12-03-2006, 11:05
Vado a braccio, spero di non commettere errori:


declare @tmp_tabella varchar(50)
declare @risultato table(tabella varchar(50), righe int)
declare cur_nomi cursor for select nometabella from db1.dbo.tabellaelenconomi
open cur_nomi
fetch next from cur_nomi into @tmp_tabella
while @@FETCH_STATUS = 0
begin
insert into @risultato select @tmp_tabella, count(*) from @tmp_tabella
fetch next from cur_nomi into @tmp_tabella
end
close cur_nomi
deallocate cur_nomi
select * from @risultato


Prova se va, comunque l'idea di fondo e' questa: crei una tabella in memoria, scorri con un cursore i nomi delle tabelle e per ognuno fai la select count e memorizzi i dati nella tabella "volante". Poi alla fine con una select star recuperi tutto.

;)

race2
13-03-2006, 10:28
GRANDISSIMO!!!

Spero un giorno di potere sviluppare cosi come te,

una cosa, mi restituisce questo errore:
--------------------------------------------------------------
Server: messaggio 137, livello 15, stato 2, riga 9
Dichiarare la variabile '@tmp_tabella'.

eppure e' dichiarata.

Emyl
16-03-2006, 09:38
Hai ragione.

Piuttosto che creare una tabella in memoria, ti conviene creare una tabella temporanea.


declare @tmp_tabella varchar(50)
create table #risultato(tabella varchar(50), righe int)
declare cur_nomi cursor for select nometabella from db1.dbo.tabellaelenconomi
open cur_nomi
fetch next from cur_nomi into @tmp_tabella
while @@FETCH_STATUS = 0
begin
insert into #risultato select @tmp_tabella, count(*) from @tmp_tabella
fetch next from cur_nomi into @tmp_tabella
end
close cur_nomi
deallocate cur_nomi
select * from #risultato


Una cosa del genere :)