2012-09-20 3 views
2

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

Для каждого server.database.dbo.table Я хочу знать содержание.

Так что мне нужно что-то вроде:

declare @numrows int = (select count(*) from sys.servers) 
declare @i int = 1 

while @i <= @numrows 
BEGIN 
declare @servername varchar(max) = (select servernaam from #servers where rij = @i) 

select * from @servername.DATABASE.DBO.TABLE 

set @i = @i+1 

END 

Однако, @servername в @servername.DATABASE.DBO.TABLE не похоже на работу.

Предложения? Спасибо, что подумал.

+2

Возможно, вас заинтересует [Практическое руководство. Выполнение операций с несколькими серверами одновременно] (http://msdn.microsoft.com/en-us/library/bb964743 (v = sql.105) .aspx) –

ответ

7

Вы должны использовать динамический SQL:

declare @numrows int = (select count(*) from sys.servers) 
declare @i int = 1 
declare @Sql(1000) 
declare @servername varchar(max) 

while @i <= @numrows 
BEGIN 
select @servername = servernaam 
from #servers where rij = @i 

set @Sql = 'select * from '[email protected]+'.DATABASE.DBO.TABLE' 
exec(@Sql) 

set @i = @i+1 

END 

Here является подробной информацией о Exec.

+0

Вы не можете используйте 'SP_EXECUTESQL' таким образом, вам все равно придется использовать конкатенацию строк, чтобы сделать запрос так же, как и для' EXEC() ', хотя я по-прежнему предлагаю использовать' SP_EXECUTESQL'. Я бы также посоветовал использовать 'SELECT * FROM '+ QUOTENAME (@Servername) +' .DATABASE.SCHEMA.TABLE'', чтобы разрешить имена серверов с зарезервированными символами или имена серверов, которые зарезервированы. – GarethD

+0

Объявление внутри цикла не будет работать хорошо –

+0

@ 'GarethD'' t-clausen.dk' Вы имеете право! Благодаря! Я редактировал. post – Parado

Смежные вопросы