SQL Server Script для итерации по серверам - PullRequest
0 голосов
/ 10 февраля 2011

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

Мой вопрос: как мне заставить скрипт распознавать связанные серверы, которые я связал с моим текущим сервером, и продолжать получать данные с этих серверов?Есть ли скрытая хранимая процедура или команда, которую кто-то может знать?

Вот мой скрипт ниже, я хочу, чтобы скрипт проходил через 5 серверов, которые я в данный момент связал с одним из моих серверов:

SET NOCOUNT ON
DECLARE @DBNAME NVARCHAR(MAX)
DECLARE @DBNAME1 NVARCHAR(MAX)
DECLARE @varSQL NVARCHAR(MAX)

DROP TABLE TEMPIMGCOUNTERSERVER3 
CREATE TABLE TEMPIMGCOUNTERSERVER3 
(DBname NVARCHAR(MAX),
Images INT,
FileSize INT,
DBCreation DATETIME)

DECLARE DBNAME CURSOR FAST_FORWARD FOR
select name from sys.databases where [NAME] LIKE 'Z%' AND create_date between '2011-02-06' and '2011-02-12'
ORDER BY [create_date]

OPEN DBNAME

FETCH NEXT FROM DBNAME INTO @DBname
WHILE (@@FETCH_STATUS=0)
BEGIN

    Set @varSQL='INSERT INTO TEMPIMGCOUNTERSERVER3 (DBNAME, IMAGES, FileSize, DBCreation) 
    SELECT ''['+@DBNAME+']'', SUM(PGCOUNT), sum(filesize/1024/1024), sys.databases.CREATE_DATE
        FROM SYS.DATABASES, ['+@DBNAME+'].dbo.tbldoc WHERE created between ''2011-02-06'' and ''2011-02-12''
        and sys.databases.name='''+@DBNAME+''' 
        GROUP BY sys.databases.NAME, sys.databases.CREATE_DATE' 
    EXEC SP_EXECUTESQL @varSQL

    FETCH NEXT FROM DBNAME 
    INTO @DBNAME
    END

    CLOSE DBNAME
    DEALLOCATE DBNAME

    INSERT TEMPIMGCOUNTERSERVER3 (DBNAME, IMAGES, FILESIZE)  
    SELECT @@SERVERNAME + ' ' +'TOTAL IMAGES AND FILE SIZE', SUM(IMAGES), SUM(FILESIZE) FROM TEMPIMGCOUNTERSERVER3 

     SELECT DBNAME, IMAGES, FILESIZE, convert(VARCHAR(10), 
    DBCREATION, 101) AS DBCREATION FROM TEMPIMGCOUNTERSERVER3
    GROUP BY DBNAME, IMAGES, FILESIZE, convert(VARCHAR(10), DBCREATION, 101)
    HAVING SUM(IMAGES) is not null
    ORDER BY DBCREATION

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

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

Одним из таких инструментов будет SQL Deploy , который позволяет вам выбрать каталог сценариев (или один сценарий), а затем развернуть этот сценарий / эти сценарии для любого количества серверов из списка, который Вы предоставляете / настраиваете.

enter image description here

Несколько похоже на SQL Multi Script от Red-Gate - опять же, вы можете выбрать несколько сценариев, и они будут выполняться на определенном вами сервере:

enter image description here

Может быть, эти инструменты стоит посмотреть?

1 голос
/ 10 февраля 2011

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

Конечно, в худшем случае вы всегда можете построить свой скрипт в виде строки в сочетании со списком и использовать EXEC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...