Где я нахожусь, у нас есть пакет программного обеспечения, работающий в системе мейнфрейма Мэйнфрейм создает ночной дамп на сервер SQL, так что каждый из наших клиентов имеет свою собственную базу данных на сервере. В экземпляре сервера также есть несколько других баз данных, плюс несколько старых клиентских БД без данных.
Нам часто нужно запускать отчеты или проверять данные по всем клиентам. Я хотел бы иметь возможность запускать запросы, используя sp_msforeachdb или что-то подобное, но я не уверен, как я могу отфильтровать нежелательные БД из списка. Есть мысли о том, как это может работать?
Мы все еще находимся на SQL Server 2000, но должны перейти на 2005 через несколько месяцев.
Обновление:
Я думаю, что плохо справился с этим вопросом, поэтому я собираюсь уточнить свои цели, а затем опубликовать решение, которое я в итоге использовал.
Что я хочу сделать, это сделать так, чтобы программисты, работающие над запросами для использования в своих программах, могли легко написать запрос с использованием одной клиентской базы данных, а затем практически мгновенно запустить (тестировать) код, разработанный и построенный на базе данных одного клиента. на всех 50 или около того клиентских БД, практически без изменений.
Имея это в виду, вот мой код, который в настоящее время находится в Management Studio (частично запутанный):
use [master]
declare @sql varchar(3900)
set @sql = 'complicated sql command added here'
-----------------------------------
declare @cmd1 varchar(100)
declare @cmd2 varchar(4000)
declare @cmd3 varchar(100)
set @cmd1 = 'if ''?'' like ''commonprefix_%'' raiserror (''Starting ?'', 0, 1) with nowait'
set @cmd3 = 'if ''?'' like ''commonprefix_%'' print ''Finished ?'''
set @cmd2 =
replace('if ''?'' like ''commonprefix_%''
begin
use [?]
{0}
end', '{0}', @sql)
exec sp_msforeachdb @command1 = @cmd1, @command2 = @cmd2, @command3 = @cmd3
Хорошая вещь в этом - все, что вам нужно сделать, это установить переменную @sql в текст вашего запроса. Очень легко превратить в хранимую процедуру. Это динамический sql, но опять же: он используется только для разработки (известные последние слова;)). Недостатком является то, что вам все еще нужно избегать одинарных кавычек, используемых в запросе, и большую часть времени вы будете добавлять дополнительный столбец ''?'' As ClientDB
в список выбора, но в остальном он работает достаточно хорошо.
Если сегодня у меня нет другой действительно хорошей идеи, я хочу превратить ее в хранимую процедуру, а также собрать версию в виде табличной функции, используя временную таблицу, чтобы поместить все результаты в один набор результатов (только для запросов на выборку) .