Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Один запрос для многих баз  [new]
M2k
Member

Откуда:
Сообщений: 136
Доброго времени суток

Вопрос глупый, но все так кто подскажет решение:

есть базы - N - штук (переменное значение , количество время от времени растет)
в каждой базе есть таблица List в которой 2 поля - Names и Data_chang

вопрос как одним запросом достать все значения этих полей из всех баз?

Спасибо
21 июл 13, 03:05    [14594331]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
M2k,

exec sp_MSforeachdb

Но учтите, что она возвращает по одному рекордсету на каждую базу. Ну и системные тоже попадают туда, а там ваших таблиц, скорее всего, нет.
21 июл 13, 10:08    [14594405]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
M2k
Member

Откуда:
Сообщений: 136
автор
Ennor Tiegael

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

DECLARE @Query varchar(300), @TableName varchar(30)
SET @TableName = @baza+'.dbo.list'
SET @Query = 'SELECT * FROM ' + @TableName
EXEC (@Query)
21 июл 13, 13:28    [14594668]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
Andraptor
Member

Откуда: Ukraine, Kharkiv
Сообщений: 291
Курсором формировать динамический запрос с UNION и все данные будут в одном рекордсете.
21 июл 13, 13:31    [14594670]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Создать VIEW с UNION ALL.
При появлении новой базы - ALTER VIEW с добавлением нового UNION ALL SELECT ...
21 июл 13, 13:52    [14594714]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
M2k
Member

Откуда:
Сообщений: 136
iap
Создать VIEW с UNION ALL.
При появлении новой базы - ALTER VIEW с добавлением нового UNION ALL SELECT ...


не совсем понял что вы имеете в виду Создать VIEW с UNION ALL.?
21 июл 13, 13:56    [14594722]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
Andraptor
Member

Откуда: Ukraine, Kharkiv
Сообщений: 291
где-то так
SET NOCOUNT ON

DECLARE @DBname VARCHAR(100)
	,@SQL VARCHAR(max)

SET @SQL = ''

DECLARE curs CURSOR
FOR
SELECT NAME
FROM sys.databases

OPEN curs

FETCH NEXT
FROM curs
INTO @DBname

WHILE @@FETCH_STATUS = 0
BEGIN
	SET @SQL = @SQL + ' UNION ALL ' + CHAR(10) + CHAR(13) + ' select Names, Data_chang from ' + @DBname + '..List' + CHAR(10) + CHAR(13)

	FETCH NEXT
	FROM curs
	INTO @DBname
END

CLOSE curs

DEALLOCATE curs

SET @SQL = substring(@SQL, 11, len(@SQL))

PRINT (@SQL)
21 июл 13, 13:56    [14594723]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
M2k
iap
Создать VIEW с UNION ALL.
При появлении новой базы - ALTER VIEW с добавлением нового UNION ALL SELECT ...


не совсем понял что вы имеете в виду Создать VIEW с UNION ALL.?
CREATE VIEW dbo.Lists AS
          SELECT DataBase=N'DB1',Names,Data_chang FROM DB1.dbo.List
UNION ALL SELECT N'DB2',Names,Data_chang FROM DB2.dbo.List
-------------------------------------------------------------------------------
UNION ALL SELECT N'DBN',Names,Data_chang FROM DBN.dbo.List;
M2k
как одним запросом достать все значения этих полей из всех баз?
SELECT DataBase=N'DB1',Names,Data_chang FROM dbo.Lists
Можно постараться и сделать это представление секционированным.
21 июл 13, 14:06    [14594741]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
Andraptor
Member

Откуда: Ukraine, Kharkiv
Сообщений: 291
iap
M2k
пропущено...


не совсем понял что вы имеете в виду Создать VIEW с UNION ALL.?
CREATE VIEW dbo.Lists AS
          SELECT DataBase=N'DB1',Names,Data_chang FROM DB1.dbo.List
UNION ALL SELECT N'DB2',Names,Data_chang FROM DB2.dbo.List
-------------------------------------------------------------------------------
UNION ALL SELECT N'DBN',Names,Data_chang FROM DBN.dbo.List;
M2k
как одним запросом достать все значения этих полей из всех баз?
SELECT DataBase=N'DB1',Names,Data_chang FROM dbo.Lists
Можно постараться и сделать это представление секционированным.

Зачем городить представление и потом его еще при необходимости модифицировать.
Не проще ли в определении курсора исключить ненужные базы и запрос будет универсальным.
Если Вы про производительность, то это не та задача, тут это будет незаметно.
21 июл 13, 14:13    [14594757]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
M2k,

для 2005+, наверное нужно еще допилить

declare @sql varchar(max)
declare @table_name varchar(50)='dbo.List'

select @sql=ISNULL(@sql+ ' UNION ALL ','')+ 'select '''+
			'SELECT * FROM '+d.name+'.'+@table_name+''' d from '+quotename(d.name)
			+'.sys.tables t WHERE object_id=object_id(N'''+@table_name+''')'
from sys.databases d
where database_id>5

select @sql

create table #tmp (s varchar(max))

insert into #tmp (s)
exec (@sql)

select @sql=s from #tmp

EXEC (@sql)

drop table #tmp
21 июл 13, 14:21    [14594775]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Andraptor
Зачем городить представление и потом его еще при необходимости модифицировать.
Не проще ли в определении курсора исключить ненужные базы и запрос будет универсальным.
Если Вы про производительность, то это не та задача, тут это будет незаметно.
И курсоры nen, и DSQL...
Да! Это будет шедевр для такой элементарной задачки!

А что, новую БД делает кто хочет, походя, между делом?
Тогда и говорить не о чем.
А если нет, то не вижу проблем модифицировать VIEW (как часть процесса создания новой базы).

Я заметил, что в предыдущем сообщении неряшливо написал SELECT
SELECT [DataBase],Names,Data_chang FROM dbo.Lists
21 июл 13, 14:24    [14594784]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
Andraptor
Member

Откуда: Ukraine, Kharkiv
Сообщений: 291
iap
Andraptor
Зачем городить представление и потом его еще при необходимости модифицировать.
Не проще ли в определении курсора исключить ненужные базы и запрос будет универсальным.
Если Вы про производительность, то это не та задача, тут это будет незаметно.
И курсоры nen, и DSQL...
Да! Это будет шедевр для такой элементарной задачки!

А что, новую БД делает кто хочет, походя, между делом?
Тогда и говорить не о чем.
А если нет, то не вижу проблем модифицировать VIEW (как часть процесса создания новой базы).

Я заметил, что в предыдущем сообщении неряшливо написал SELECT
SELECT [DataBase],Names,Data_chang FROM dbo.Lists

Вот как раз создавать лишние объекты в БД - это как раз и будет шедевр для такой элементарной задачки ;-)
21 июл 13, 14:30    [14594798]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
qwerty112
Guest
Andraptor
Вот как раз создавать лишние объекты в БД - это как раз и будет шедевр для такой элементарной задачки ;-)

а скрипт ваш, ТС каждый раз будет набирать заново или это всё-таки будет "лишний объект в БД" ХП ?
21 июл 13, 14:33    [14594812]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
Andraptor
Member

Откуда: Ukraine, Kharkiv
Сообщений: 291
qwerty112
Andraptor
Вот как раз создавать лишние объекты в БД - это как раз и будет шедевр для такой элементарной задачки ;-)

а скрипт ваш, ТС каждый раз будет набирать заново или это всё-таки будет "лишний объект в БД" ХП ?

Это обычный запрос, зачем его где-то набирать или хранить.
Я не навязываю никому свое решение, просто предложил один из вариантов.
21 июл 13, 14:45    [14594842]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Andraptor,
а нафига курсор-то городить??? Если уж приспичило динамику - так проще надо
DECLARE @SQL VARCHAR(max)=''
SELECT @SQL+='
UNION ALL 
select Names, Data_chang from [' + name + ']..List' FROM sys.databases 
SET @SQL = stuff(@SQL,1,14,'')
PRINT (@SQL)
21 июл 13, 17:01    [14595181]     Ответить | Цитировать Сообщить модератору
 Re: Один запрос для многих баз  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
кстати, а существующие базы могут отключаться/удаляться?
а то при этом условие другое решение нужно
22 июл 13, 10:24    [14597417]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить