SQL Server Script для итерации по серверам. Часть 2 - PullRequest
0 голосов
/ 15 февраля 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

Должен ли я добавить еще один курсор? Что-то с этим скриптом:

выберите имя srvname из master..sysservers, где имя srvname подобно 'sql%'

1 Ответ

0 голосов
/ 15 февраля 2011

Я бы просто вложил ваш курсор в другой курсор, который работает на связанных серверах.отфильтруйте список серверов из master..sysservers в поле srvproduct, где он равен «SQL Server».если есть что-то в этом списке, вы не хотите помещать его в пункт not in.затем измените свой внутренний курсор, чтобы добавить имя сервера в запрос, дав вам имя таблицы из четырех частей.

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