Выполнение SQL-запроса для нескольких баз данных

sql
Вопрос: Я знаю, что мой пост имеет очень похожий титул на других в этом форуме, но я действительно не мог найти ответ, который мне нужен. Вот моя проблема, у меня на сервере Windows работает SQL Server. Внутри моего SQL Server у меня около 30 баз данных. Все они имеют одинаковые таблицы и одни и те

Вопрос:

Я знаю, что мой пост имеет очень похожий титул на других в этом форуме, но я действительно не мог найти ответ, который мне нужен.

Вот моя проблема, у меня на сервере Windows работает SQL Server. Внутри моего SQL Server у меня около 30 баз данных. Все они имеют одинаковые таблицы и одни и те же хранимые процедуры.

Теперь, вот проблема, у меня есть этот огромный скрипт, который мне нужно запустить во всех этих базах данных. Хотел бы я сделать это только один раз против всех моих баз данных.

Я попробовал пару вещей, например, “посмотреть” >> зарегистрированные серверы >> локальные группы серверов >> регистрация нового сервера. Но это решение для многих серверов, а не для многих баз данных.

Я знаю, что могу это сделать, набрав имя базы данных, но запрос действительно огромный, поэтому для всех баз данных потребуется слишком много времени.

Кто-нибудь знает, возможно ли это?

Лучший ответ:

ApexSQL Propagate – это инструмент, который может помочь в этой ситуации. Он используется для выполнения одного или нескольких сценариев для нескольких баз данных, даже нескольких серверов. Вам нужно просто выбрать этот скрипт, а затем выбрать все базы данных, для которых вы хотите выполнить этот скрипт:

select databases

Когда вы загружаете скрипты и базы данных, вы должны просто нажать кнопку “Выполнить” и дождаться результатов:

click the execute button

Ответ №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. Кроме того, путь к файлу не может иметь пробелов. Я ценю вашу помощь!

Оцените статью
Добавить комментарий