15. december 2010 - 16:00Der 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
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
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
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.