15. december 2010 - 16:00
Der er
4 kommentarer og
1 løsning
loop gennem flere databaser
Hej!
Jeg har en database server med mange næsten ens databaser, jeg kunne godt tænke mig et script der kunne udføre sql/ddl statement på en enkelt udvalgt tabel i hver database
Jeg kan godt loope over navnet og genere det rigtigt i variablen, men når jeg vil anvende det fejler det.
Det er ved
use @dbnavn
select count(*) from tabel
go
nogen er ved hvordan ?
declare @id char(2);
declare @dbnavn varchar(100);
declare @dblist varchar(100);
declare @oldi int;
declare @i int;
set @dblist = '01,03,07,08,09,12,13,15,17,19,20,21,23,24,25,38,40,42,43,44,48,49,50,82,83';
set @i = CHARINDEX(',',@dblist);
set @oldi = 0;
while @i > 0 begin
set @id= SUBSTRING(@dblist,@oldi+1,@i-@oldi);
set @dbnavn = 'databasenr' + @id + '_kunde';
if (@id = 3)
print @dbnavn;
use @dbnavn;
select COUNT(*) from 2D_PULJE
go
set @oldi = @i;
set @i = CHARINDEX(',',@dblist,@oldi+1)
end
15. december 2010 - 16:23
#1
Man kan ikke bruge en variable i forbindelse med en USE statement.
Løsningen kan være at samle både USE samt select'en i en dynamisk stump sql, sådan her (der er kun rettet nogle linjer nede omkring der hvor du får fejlen):
declare @id char(2);
declare @dbnavn varchar(100);
declare @dblist varchar(100);
declare @oldi int;
declare @i int;
set @dblist = '01,03,07,08,09,12,13,15,17,19,20,21,23,24,25,38,40,42,43,44,48,49,50,82,83';
set @i = CHARINDEX(',',@dblist);
set @oldi = 0;
while @i > 0 begin
set @id= SUBSTRING(@dblist,@oldi+1,@i-@oldi);
set @dbnavn = 'databasenr' + @id + '_kunde';
if (@id = 3)
print @dbnavn;
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'use [' + @dbnavn + '];
select COUNT(*) from 2D_PULJE'
EXEC sp_executesql @sql
set @oldi = @i;
set @i = CHARINDEX(',',@dblist,@oldi+1)
end
20. december 2010 - 08:55
#3
Hej Sjang tak for løsningen, arne_v ja det kunne jeg også :-) prøver mig lidt frem... Sjang vil du lægge et svar tror det er fair du får point her :-) håber du er enig arne_v