Я использую простой курсор, чтобы выполнить это .... это довольно прямолинейно, и вы можете запускать в нем любой оператор, в отношении списка баз данных.
--Drop temporary tables if they already exists.
IF OBJECT_ID('tempdb..#DatabaseNames') IS NOT NULL
DROP TABLE #DatabaseNames
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
--Create a temporary table.
CREATE TABLE #DatabaseNames
(
DBName varchar(100),
Active bit
)
GO
--Create a temporary table to store results.
CREATE TABLE #Results
(
FirstName varchar(100),
WebLogin varchar(100)
)
GO
--It's the long way to do this but just showing for the sake of the example.
INSERT INTO #DatabaseNames
VALUES ('Database1', 1)
INSERT INTO #DatabaseNames
VALUES ('Database2', 0)
INSERT INTO #DatabaseNames
VALUES ('Database3', 1)
INSERT INTO #DatabaseNames
VALUES ('TIER1', 1)
INSERT INTO #DatabaseNames
VALUES ('Northwind', 1)
DECLARE @DBName varchar(20)
DECLARE @SQL varchar(2000)
--Start cursor
DECLARE LoopCursor CURSOR FOR
SELECT DBName AS 'DBName'
FROM #DatabaseNames
WHERE DBName NOT IN ('TIER1', 'Northwind')
AND Active = 1
OPEN LoopCursor
FETCH NEXT FROM LoopCursor
INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = '
INSERT INTO #Results
SELECT FirstName, WebLogin
FROM ' + @DBName + '.dbo.Users
WHERE FirstName = ''User1''
AND LastName = ''User1''
AND WebLogin = ''User1Login'''
EXEC(@SQL)
--Print @DBName
FETCH NEXT FROM LoopCursor
INTO @DBName
END
SELECT *
FROM #Results
CLOSE LoopCursor
DEALLOCATE LoopCursor
Я изменил свой ответ снова, чтобы перейти к последнему комментарию о желании всех результатов в одной таблице. Вы можете добавить еще одну временную таблицу и просто вставить в нее данные. Затем, как только закончите, выберите из этой таблицы перед закрытием курсора. Что касается имеющих много критериев в пункте WHERE
можно заключить одиночные кавычки с 2 одиночными кавычками, так WHERE name = 'MyName'
становится WHERE name = ''MyName''
BTW, я курсоры не самый процессор дружественными и большинству из них не нравится использовать их, но у них есть их место. Я не предлагаю, чтобы это было наилучшим решением, но оно работает хорошо. У нас более 75 баз данных клиентов, все они имеют одинаковую структуру, и я использую эту ежедневную информацию для обновления полей пользователя и других полей таблицы. Он работает довольно быстро, чтобы выполнить так много утверждений во многих базах данных.
Я бы предположил выбор из sys.databases, плюс оператор «where in» для ветвей. – evictednoise
Как вы используете sys.databases? Я не делал этого раньше ... – Becky
Это представление в sql server master db, которое содержит информацию о базе данных. просто попробуйте 'select * from sys.databases'. Также msdn https://msdn.microsoft.com/en-us/library/ms178534.aspx – evictednoise