2016-10-10 2 views
0

У нас есть серверы по 100 БД каждый. Я хочу запустить инструкцию select примерно на 50-75 баз данных на каждом сервере.Создание цикла while для запуска оператора select в отношении списка БД на одном сервере

Я могу написать инструкцию select, чтобы поместить необходимые DB в временную таблицу.

Оттуда я хочу запустить цикл while, который проходит через каждую БД и запускает оператор select, чтобы я мог выяснить, какие БД имеют эту активную учетную запись. Его нужно регулярно запускать, поэтому я не просто делаю это вручную.

Вот что у меня есть. Это дает мне ошибку на моей команде «использовать», говоря, неправильный синтаксис около @hospuse

DECLARE @hospcounter INT; 
DECLARE @hospuse varchar(100); 
DECLARE @userlogin varchar(50); 
SET @hospcounter = 0; 
SET @hospuse = (select name from #tempdbnames where hospnumber = '1') 
SET @userlogin = 'dmarch' 

SELECT IDENTITY(int, 1,1) AS hospnumber, name into #tempdbnames 
FROM master.dbo.sysdatabases 
where name NOT LIKE ('%storage_0%') 
AND NAME NOT LIKE ('%WSR%') 
AND name NOT LIKE ('Z%') 
AND name NOT LIKE ('master') 
AND name NOT LIKE ('model') 
AND name NOT LIKE ('msdb') 
AND name NOT LIKE ('tempdb') 
AND name NOT LIKE ('_Placeholder') 




WHILE @hospcounter <= (select MAX(hospnumber) from #tempdbnames) 
BEGIN 
USE @hospuse 
SELECT ro.user_login, ro.activated from rev_operator ro where ro.user_login = @userlogin and ro.activated != '0' 

SET @hospcounter = @hospcounter + 1; 
SET @hospuse = (select name from #tempdbnames where hospnumber = @hospcounter); 
END; 

PRINT 'Done'; 
GO 

стола падения #tempdbnames

Я также попытался это с sp_msforeachdb, но не мог понять, как получить синтаксис прямо для фильтрации БД, которые я хотел использовать, без буквального указания NOT IN и перечисления каждой БД, которую я не хотел. Это не работает, потому что DB добавляются регулярно.

ответ

0

При попытке запустить один и тот же запрос в нескольких базах данных курсоры действительно будут хорошим вариантом.

DECLARE @Databases Table (DBName varchar(256)) 
DECLARE @Name varchar(256) 
DECLARE @SQL Nvarchar(max) 
DECLARE @userlogin varchar(50) 
SET @userlogin = 'dmarch' 

INSERT @Databases 
select name from sys.databases where name NOT LIKE ('%storage_0%') 
AND NAME NOT LIKE ('%WSR%') 
AND name NOT LIKE ('Z%') 
AND name NOT LIKE ('master') 
AND name NOT LIKE ('model') 
AND name NOT LIKE ('msdb') 
AND name NOT LIKE ('tempdb') 
AND name NOT LIKE ('_Placeholder') 




DECLARE DBCursor Cursor For 
Select DBName 
from @Databases 

OPEN DBCursor 
FETCH NEXT 
FROM DBCursor 
INTO @Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @SQL = N'USE ['[email protected]+'] 
select ''['[email protected]+']'', ro.user_login, ro.activated from rev_operator ro where ro.user_login = @userlogin and ro.activated != ''0''' 

EXEC sp_executesql @SQL 


FETCH NEXT 
     FROM DBCursor 
     INTO @Name 
END 

CLOSE DBCursor 
DEALLOCATE DBCursor 
+0

Я получаю это. – Frontier3

+0

Msg 208, уровень 16, состояние 1, строка 38 Неверное имя объекта 'rev_operator'. – Frontier3

+0

Восстановленный оригинальный ответ, который не включал в себя необходимый динамический SQL, мои извинения. Попробуйте, если ошибка сохранится, то это звучит, как некорректные базы данных вставляются в таблицу, я бы проверил предложение WHERE, чтобы убедиться, что вся база данных, в которой мы не хотим, чтобы выполняемый запрос был отфильтрован – sqlnick

 Смежные вопросы

  • Нет связанных вопросов^_^