Вопрос:
Я знаю, что мой пост имеет очень похожий титул на других в этом форуме, но я действительно не мог найти ответ, который мне нужен.
Вот моя проблема, у меня на сервере Windows работает SQL Server. Внутри моего SQL Server у меня около 30 баз данных. Все они имеют одинаковые таблицы и одни и те же хранимые процедуры.
Теперь, вот проблема, у меня есть этот огромный скрипт, который мне нужно запустить во всех этих базах данных. Хотел бы я сделать это только один раз против всех моих баз данных.
Я попробовал пару вещей, например, “посмотреть” >> зарегистрированные серверы >> локальные группы серверов >> регистрация нового сервера. Но это решение для многих серверов, а не для многих баз данных.
Я знаю, что могу это сделать, набрав имя базы данных, но запрос действительно огромный, поэтому для всех баз данных потребуется слишком много времени.
Кто-нибудь знает, возможно ли это?
Лучший ответ:
ApexSQL Propagate – это инструмент, который может помочь в этой ситуации. Он используется для выполнения одного или нескольких сценариев для нескольких баз данных, даже нескольких серверов. Вам нужно просто выбрать этот скрипт, а затем выбрать все базы данных, для которых вы хотите выполнить этот скрипт:
Когда вы загружаете скрипты и базы данных, вы должны просто нажать кнопку “Выполнить” и дождаться результатов:
Ответ №1
Попробуйте запустить сценарий в режиме SQLCMD из SSMS (Query – режим SQLCMD). Таким образом, вы можете сохранить сценарий в файл и легко запустить его в контексте каждой из требуемых баз данных:
USE DB1; :r C:SqlScriptYourLargeScript.sql GO USE DB2; :r C:SqlScriptYourLargeScript.sql GO USE DB3; :r C:SqlScriptYourLargeScript.sql GO Ответ №2
Вы можете написать сценарий, подобный этому
DECLARE CURSOR_ALLDB_NAMES CURSOR FOR SELECT name FROM Sys.Databases WHERE name NOT IN(‘master’, ‘tempdb’) OPEN CURSOR_ALLDB_NAMES FETCH CURSOR_ALLDB_NAMES INTO @DB_NAME WHILE @@Fetch_Status = 0 BEGIN EXEC(‘UPDATE ‘+ @DB_NAME + ‘..SameTableNameAllDb SET Status=1’) FETCH CURSOR_ALLDB_NAMESINTO INTO @DB_NAME END CLOSE CURSOR_ALLDB_NAMES Ответ №3
это нормальный способ сделать это:
предположим, что вы хотите сделать выбор в базе данных DBOther, чем это было бы:
select * from DBOther..TableName
Также проверьте, находится ли таблица или представление в схеме dbo, если вы также не должны добавить схему: Обратите внимание, что я использую только одну точку теперь после имени базы данных
select * from DBOther.dbo.ViewName
Если какая-либо из баз данных находится на другом сервере на другом компьютере, убедитесь, что база данных находится на связанном сервере.
Затем вы можете получить доступ к таблице или представлению в этой базе данных через:
SELECT * FROM [AnotherServerName].[DB].[dbo].[Table]
Вот еще один способ, который не требует ввода имени базы данных:
use DB1 go select * from table1 go use DB2 go select * from table1 go
Обратите внимание, что это будет работать, только если таблицы и поля будут одинаковыми в каждой базе данных
Ответ №4
Дэн ответ решил мою проблему! Всего лишь одно наблюдение, мне пришлось включить вкладку SQLCMD Mode on Query в SQL Server Management. Кроме того, путь к файлу не может иметь пробелов. Я ценю вашу помощь!